[NOTHING CHANGED] Move to maven and massive clean and fixup #93

Closed
farmboy0 wants to merge 43 commits from farmboy0/master into master
138 changed files with 20460 additions and 39 deletions
Showing only changes of commit 1833c57d4d - Show all commits

View File

@@ -0,0 +1,240 @@
11
abc 123 nil pqr
F
F
T
assert(true) true
pcall(assert,true) true
pcall(assert,false) false string
pcall(assert,nil) false string
pcall(assert,true,"msg") true
pcall(assert,false,"msg") false string
pcall(assert,nil,"msg") false string
pcall(assert,false,"msg","msg2") false string
collectgarbage("count") number
collectgarbage("collect") number
collectgarbage("count") number
pcall(ipairs) false string
pcall(ipairs,nil) false string
pcall(ipairs,"a") false string
pcall(ipairs,1) false string
ipairs2 1 one
ipairs2 2 two
ipairs4 1 one
ipairs4 2 two
table loaded
load: nil
load("print(3+4); return 8") func.1 nil
7
load("print(3+4); return 8")() 8
pcall(pairs) false string
pcall(pairs,nil) false string
pcall(pairs,"a") false string
pcall(pairs,1) false string
pairs2 1 one
pairs2 2 two
pairs3 aa aaa
pairs4 1 one
pairs4 2 two
pairs4 aa aaa
pairs5 20 30
pairs5 30 20
_G["abc"] (before) nil
_G["abc"] (after) def
type(nil) nil
type("a") string
type(1) number
type(1.5) number
type(function() end) function
type({}) table
type(true) boolean
type(false) boolean
pcall(type,type) function
pcall(type) false string
(function() return pcall(type) end)() false string
la() false string
ga() false string
getmetatable(ta) nil
getmetatable(tb) nil
setmetatable(ta),{cc1="ccc1"} table
setmetatable(tb),{dd1="ddd1"} table
getmetatable(ta)["cc1"] ccc1
getmetatable(tb)["dd1"] ddd1
getmetatable(1) nil
pcall(setmetatable,1) false string
pcall(setmetatable,nil) false string
pcall(setmetatable,"ABC") false string
pcall(setmetatable,function() end) false string
pcall(rawget) false string
pcall(rawget,"a") false string
pcall(rawget,s) false string
pcall(rawget,t) false string
s nil nil ccc ddd nil nil nil
s nil nil ccc ddd nil nil nil
t aaa bbb ccc ddd nil nil nil
t nil nil ccc ddd nil nil nil
mt aaa bbb nil nil nil nil nil
mt aaa bbb nil nil nil nil nil
pcall(rawset,s,"aa","www") tbl.2
s www nil ccc ddd nil nil nil
s www nil ccc ddd nil nil nil
t aaa bbb ccc ddd nil nil nil
t nil nil ccc ddd nil nil nil
mt aaa bbb nil nil nil nil nil
mt aaa bbb nil nil nil nil nil
pcall(rawset,s,"cc","xxx") tbl.2
s www nil xxx ddd nil nil nil
s www nil xxx ddd nil nil nil
t aaa bbb ccc ddd nil nil nil
t nil nil ccc ddd nil nil nil
mt aaa bbb nil nil nil nil nil
mt aaa bbb nil nil nil nil nil
pcall(rawset,t,"aa","yyy") tbl.3
s www nil xxx ddd nil nil nil
s www nil xxx ddd nil nil nil
t yyy bbb ccc ddd nil nil nil
t yyy nil ccc ddd nil nil nil
mt aaa bbb nil nil nil nil nil
mt aaa bbb nil nil nil nil nil
pcall(rawset,t,"dd","zzz") tbl.3
s www nil xxx ddd nil nil nil
s www nil xxx ddd nil nil nil
t yyy bbb ccc zzz nil nil nil
t yyy nil ccc zzz nil nil nil
mt aaa bbb nil nil nil nil nil
mt aaa bbb nil nil nil nil nil
pcall(rawlen, {}) 0
pcall(rawlen, {"a"}) 1
pcall(rawlen, {"a","b"}) 2
pcall(rawlen, "") 0
pcall(rawlen, "a") 1
pcall(rawlen, "ab") 2
pcall(rawlen, 1) false string
pcall(rawlen, nil) false string
pcall(rawlen) false string
s www nil xxx ddd nil nil nil
s www nil xxx ddd nil nil nil
t yyy bbb ccc zzz nil nil nil
t yyy nil ccc zzz nil nil nil
mt aaa bbb nil nil nil nil nil
mt aaa bbb nil nil nil nil nil
s["ee"]="ppp"
s www nil xxx ddd ppp nil nil
s www nil xxx ddd ppp nil nil
t yyy bbb ccc zzz nil nil nil
t yyy nil ccc zzz nil nil nil
mt aaa bbb nil nil nil nil nil
mt aaa bbb nil nil nil nil nil
s["cc"]="qqq"
s www nil qqq ddd ppp nil nil
s www nil qqq ddd ppp nil nil
t yyy bbb ccc zzz nil nil nil
t yyy nil ccc zzz nil nil nil
mt aaa bbb nil nil nil nil nil
mt aaa bbb nil nil nil nil nil
t["ff"]="rrr"
s www nil qqq ddd ppp nil nil
s www nil qqq ddd ppp nil nil
t yyy bbb ccc zzz nil rrr nil
t yyy nil ccc zzz nil nil nil
mt aaa bbb nil nil nil rrr nil
mt aaa bbb nil nil nil rrr nil
t["dd"]="sss"
s www nil qqq ddd ppp nil nil
s www nil qqq ddd ppp nil nil
t yyy bbb ccc sss nil rrr nil
t yyy nil ccc sss nil nil nil
mt aaa bbb nil nil nil rrr nil
mt aaa bbb nil nil nil rrr nil
mt["gg"]="ttt"
s www nil qqq ddd ppp nil nil
s www nil qqq ddd ppp nil nil
t yyy bbb ccc sss nil rrr ttt
t yyy nil ccc sss nil nil nil
mt aaa bbb nil nil nil rrr ttt
mt aaa bbb nil nil nil rrr ttt
pcall(select) false string
select(1,11,22,33,44,55) 11 22 33 44 55
select(2,11,22,33,44,55) 22 33 44 55
select(3,11,22,33,44,55) 33 44 55
select(4,11,22,33,44,55) 44 55
pcall(select,5,11,22,33,44,55) 55
pcall(select,6,11,22,33,44,55) nil
pcall(select,7,11,22,33,44,55) nil
pcall(select,0,11,22,33,44,55) false string
pcall(select,-1,11,22,33,44,55) 55
pcall(select,-2,11,22,33,44,55) 44
pcall(select,-4,11,22,33,44,55) 22
pcall(select,-5,11,22,33,44,55) 11
pcall(select,-6,11,22,33,44,55) false string
pcall(select,1) nil
pcall(select,select) false string
pcall(select,{}) false string
pcall(select,"2",11,22,33) 22
pcall(select,"abc",11,22,33) false string
pcall(tonumber) nil
pcall(tonumber,nil) nil
pcall(tonumber,"abc") nil
pcall(tonumber,"123") 123
pcall(tonumber,"123",10) 123
pcall(tonumber,"123",8) 83
pcall(tonumber,"123",6) 51
pcall(tonumber,"10101",4) 273
pcall(tonumber,"10101",3) 91
pcall(tonumber,"10101",2) 21
pcall(tonumber,"1a1",16) 417
pcall(tonumber,"1a1",32) 1345
pcall(tonumber,"1a1",54) false string
pcall(tonumber,"1a1",1) false string
pcall(tonumber,"1a1",0) false string
pcall(tonumber,"1a1",-1) false string
pcall(tonumber,"1a1","32") 1345
pcall(tonumber,"123","456") false string
pcall(tonumber,"1a1",10) nil
pcall(tonumber,"151",4) nil
pcall(tonumber,"151",3) nil
pcall(tonumber,"151",2) nil
pcall(tonumber,"123",8,8) 83
pcall(tonumber,123) 123
pcall(tonumber,true) nil
pcall(tonumber,false) nil
pcall(tonumber,tonumber) nil
pcall(tonumber,function() end) nil
pcall(tonumber,{"one","two",a="aa",b="bb"}) nil
pcall(tonumber,"123.456") 123.456
pcall(tonumber," 123.456") 123.456
pcall(tonumber," 234qwer") nil
pcall(tonumber,"0x20") 32
pcall(tonumber," 0x20") 32
pcall(tonumber,"0x20 ") 32
pcall(tonumber," 0x20 ") 32
pcall(tonumber,"0X20") 32
pcall(tonumber," 0X20") 32
pcall(tonumber,"0X20 ") 32
pcall(tonumber," 0X20 ") 32
pcall(tonumber,"0x20",10) nil
pcall(tonumber,"0x20",16) nil
pcall(tonumber,"0x20",8) nil
pcall(tostring) nil
pcall(tostring,nil) nil
pcall(tostring,"abc") abc
pcall(tostring,"abc","def") abc
pcall(tostring,123) 123
pcall(tostring,true) true
pcall(tostring,false) false
tostring(tostring) string
tostring(function() end) string
tostring({"one","two",a="aa",b="bb"}) string
_VERSION string
pcall(badfunc) false string
pcall(badfunc,errfunc) false string
pcall(badfunc,badfunc) false string
pcall(wrappedbad) nil
pcall(wrappedbad,errfunc) nil
pcall(xpcall(badfunc)) false string
in errfunc string
pcall(xpcall(badfunc,errfunc)) false
pcall(xpcall(badfunc,badfunc)) false
pcall(xpcall(wrappedbad)) false string
xpcall(wrappedbad,errfunc) true

View File

@@ -0,0 +1,74 @@
running is not nil
co.status suspended
co-body 1 10
foo 2
main true 4
co.status suspended
co-body r
main true 11 -9
co.status suspended
co-body x y
running is not nil
co.status.inside running
co.status.inside running
co.status.inside2 normal
main true 10 end
co.status dead
main false cannot resume dead coroutine
co.status dead
running is not nil
co.status suspended
co-body 1 10
foo 2
main true 4
co.status suspended
co-body nil nil
main true 11 -9
co.status suspended
co-body x y
main true 10 end
co.status dead
main false cannot resume dead coroutine
co.status dead
co-body 1 10
foo 2
g 4
co-body r
g 11 -9
co-body x y
g 10 end
g cannot resume dead coroutine
(main) sending args 111 222 333
(echocr) first args 111 222 333
(main) resume returns true 111 222 333
(main) sending args
(echoch) yield returns
(main) resume returns true
(main) sending args 111
(echoch) yield returns 111
(main) resume returns true 111
(main) sending args 111 222 333
(echoch) yield returns 111 222 333
(main) resume returns true 111 222 333
main-b suspended
main-c suspended
b-resumed main-arg-for-b true
b-b running
b-c suspended
b-resume-b false cannot resume non-suspended coroutine
c-resumed b-arg-for-c true
c-b normal
c-c running
c-resume-b false cannot resume non-suspended coroutine
c-resume-c false cannot resume non-suspended coroutine
b-resume-c false attempt to yield across metamethod/C-call boundary
main-resume-b false attempt to yield across metamethod/C-call boundary
main-resume-c false cannot resume dead coroutine
main-b dead
main-c dead
main-resume-b false cannot resume dead coroutine
main-resume-c false cannot resume dead coroutine
main-b dead
main-c dead
main-resume-b false cannot resume dead coroutine
main-resume-c false cannot resume dead coroutine

View File

@@ -0,0 +1,329 @@
has debug true
----- debug.getlocal, debug.setlocal
true h-3-0 -> 3-0 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={3,0,#} f locals=,3,0,#,4,5,6
true h-3-1 -> 3-1 get=a,3 set=a,nil get=a,# g locals=7,8,9 tbl={3,1,#} f locals=,#,1,#,4,5,6
true h-3-2 -> 3-2 get=b,2 set=b,nil get=b,# g locals=7,8,9 tbl={3,2,#} f locals=,3,#,#,4,5,6
true h-3-3 -> 3-3 get=c,# set=c,nil get=c,# g locals=7,8,9 tbl={3,3,#} f locals=,3,3,#,4,5,6
true h-3-4 -> 3-4 get=d,4 set=d,nil get=d,# g locals=7,8,9 tbl={3,4,#} f locals=,3,4,#,#,5,6
true h-3-5 -> 3-5 get=e,5 set=e,nil get=e,# g locals=7,8,9 tbl={3,5,#} f locals=,3,5,#,4,#,6
true h-3-6 -> 3-6 get=f,6 set=f,nil get=f,# g locals=7,8,9 tbl={3,6,#} f locals=,3,6,#,4,5,#
true h-3-7 -> 3-7 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={3,7,#} f locals=,3,7,#,4,5,6
true h-2-0 -> 2-0 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,0,#} f locals=,2,0,#,4,5,6
true h-2-1 -> 2-1 get=p,7 set=p,nil get=p,# g locals=#,8,9 tbl={2,1,#} f locals=,2,1,#,4,5,6
true h-2-2 -> 2-2 get=q,8 set=q,nil get=q,# g locals=7,#,9 tbl={2,2,#} f locals=,2,2,#,4,5,6
true h-2-3 -> 2-3 get=r,9 set=r,nil get=r,# g locals=7,8,# tbl={2,3,#} f locals=,2,3,#,4,5,6
true h-2-4 -> 2-4 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,4,#} f locals=,2,4,#,4,5,6
true h-2-5 -> 2-5 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,5,#} f locals=,2,5,#,4,5,6
true h-2-6 -> 2-6 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,6,#} f locals=,2,6,#,4,5,6
true h-2-7 -> 2-7 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,7,#} f locals=,2,7,#,4,5,6
true h-1-3 -> 1-3 get=n,# set=n,nil get=n,# g locals=7,8,9 tbl={1,3,#} f locals=,1,3,#,4,5,6
true h-1-4 -> 1-4 get=#,nil set=x1,nil get=x1,# g locals=7,8,9 tbl={1,4,#} f locals=,1,4,#,4,5,6
true h-1-5 -> 1-5 get=nil,# set=y1,nil get=y1,# g locals=7,8,9 tbl={1,5,#} f locals=,1,5,#,4,5,6
true h-1-6 -> 1-6 get=nil,nil set=nil,nil get=x2,nil g locals=7,8,9 tbl={1,6,#} f locals=,1,6,#,4,5,6
true h-1-7 -> 1-7 get=nil,nil set=nil,nil get=y2,nil g locals=7,8,9 tbl={1,7,#} f locals=,1,7,#,4,5,6
----- debug.getupvalue, debug.setupvalue
h 101 102 103 104 105 106 107 108 109
f -> 1-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,101,102,103,104,105,106,107,108,109
f -> 1-1 get=true,m,101 set=true,m,nil get=true,m,777001 tbl=true,777001,102,103,104,105,106,107,108,109
f -> 1-2 get=true,n,102 set=true,n,nil get=true,n,777002 tbl=true,777001,777002,103,104,105,106,107,108,109
f -> 1-3 get=true,o,103 set=true,o,nil get=true,o,777003 tbl=true,777001,777002,777003,104,105,106,107,108,109
f -> 1-4 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
f -> 1-5 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
f -> 1-6 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
f -> 1-7 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
f -> 1-8 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
f -> 1-9 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
f -> 1-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
g -> 2-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
g -> 2-1 get=true,m,777001 set=true,m,nil get=true,m,888001 tbl=true,888001,777002,777003,104,105,106,107,108,109
g -> 2-2 get=true,n,777002 set=true,n,nil get=true,n,888002 tbl=true,888001,888002,777003,104,105,106,107,108,109
g -> 2-3 get=true,o,777003 set=true,o,nil get=true,o,888003 tbl=true,888001,888002,888003,104,105,106,107,108,109
g -> 2-4 get=true,p,104 set=true,p,nil get=true,p,888004 tbl=true,888001,888002,888003,888004,105,106,107,108,109
g -> 2-5 get=true,q,105 set=true,q,nil get=true,q,888005 tbl=true,888001,888002,888003,888004,888005,106,107,108,109
g -> 2-6 get=true,r,106 set=true,r,nil get=true,r,888006 tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
g -> 2-7 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
g -> 2-8 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
g -> 2-9 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
g -> 2-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
h -> 3-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
h -> 3-1 get=true,m,888001 set=true,m,nil get=true,m,999001 tbl=true,999001,888002,888003,888004,888005,888006,107,108,109
h -> 3-2 get=true,n,888002 set=true,n,nil get=true,n,999002 tbl=true,999001,999002,888003,888004,888005,888006,107,108,109
h -> 3-3 get=true,o,888003 set=true,o,nil get=true,o,999003 tbl=true,999001,999002,999003,888004,888005,888006,107,108,109
h -> 3-4 get=true,p,888004 set=true,p,nil get=true,p,999004 tbl=true,999001,999002,999003,999004,888005,888006,107,108,109
h -> 3-5 get=true,q,888005 set=true,q,nil get=true,q,999005 tbl=true,999001,999002,999003,999004,999005,888006,107,108,109
h -> 3-6 get=true,r,888006 set=true,r,nil get=true,r,999006 tbl=true,999001,999002,999003,999004,999005,999006,107,108,109
h -> 3-7 get=true,v,107 set=true,v,nil get=true,v,999007 tbl=true,999001,999002,999003,999004,999005,999006,999007,108,109
h -> 3-8 get=true,w,108 set=true,w,nil get=true,w,999008 tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,109
h -> 3-9 get=true,x,109 set=true,x,nil get=true,x,999009 tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,999009
h -> 3-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,999009
----- debug.setmetatable, debug.getmetatable
a.a=bbb a.b=nil b.a=nil b.b=nil
a.a=bbb a.b=ccc b.a=nil b.b=nil
boolean table nil table
boolean nil nil nil
boolean table nil nil
a.a=bbb a.b=nil b.a=nil b.b=nil
boolean nil nil nil
get=true,true,nil
set=true,true,nil
get=true,true,nil
get=true,true,nil
set=true,true,nil
get=true,true,nil
true nil
true 1
true 1
----- debug.getinfo
6
---
debug.getinfo(1)
source: @debuglib.lua
short_src: debuglib.lua
what: Lua
currentline: 144
linedefined: 141
lastlinedefined: 155
nups: 5
func: function
debug.getinfo(1,"")
debug.getinfo(1,"l")
currentline: 146
debug.getinfo(1,"fL")
func: function
activelines: {}
debug.getinfo(2)
source: @debuglib.lua
short_src: debuglib.lua
what: Lua
currentline: 157
linedefined: 135
lastlinedefined: 159
nups: 6
func: function
debug.getinfo(2,"l")
currentline: 157
debug.getinfo(2,"fL")
func: function
activelines: {}
debug.getinfo(10,"")
true
debug.getinfo(-10,"")
true
---
5
e,f,g true function function
debug.getinfo(f)
true
source: @debuglib.lua
short_src: debuglib.lua
what: Lua
currentline: -1
linedefined: 137
lastlinedefined: 140
nups: 1
func: function
debug.getinfo(f,"nSlufL")
true
source: @debuglib.lua
short_src: debuglib.lua
what: Lua
currentline: -1
linedefined: 137
lastlinedefined: 140
nups: 1
func: function
activelines: {}
debug.getinfo(f,"n")
true
debug.getinfo(f,"S")
true
source: @debuglib.lua
short_src: debuglib.lua
what: Lua
linedefined: 137
lastlinedefined: 140
debug.getinfo(f,"l")
true
currentline: -1
debug.getinfo(f,"u")
true
nups: 1
debug.getinfo(f,"f")
true
func: function
debug.getinfo(f,"L")
true
activelines: {}
debug.getinfo(g)
true
source: @debuglib.lua
short_src: debuglib.lua
what: Lua
currentline: -1
linedefined: 141
lastlinedefined: 155
nups: 5
func: function
debug.getinfo(test)
true
source: @debuglib.lua
short_src: debuglib.lua
what: Lua
currentline: -1
linedefined: 135
lastlinedefined: 159
nups: 6
func: function
----- debug.sethook, debug.gethook
... in hook call nil
info[2]=debuglib.lua,177
... in hook call nil
info[2]=debuglib.lua,176
... in hook call nil
info[2]=[C],-1
... in hook call nil
info[2]=[C],-1
hook = c -> result=true,nil,nil,nil,false,false,nil
... in hook return nil
info[2]=[C],-1
... in hook return nil
info[2]=[C],-1
hook = r -> result=true,nil,nil,nil,false,false,nil
... in hook line 192
info[2]=debuglib.lua,192
... in hook line 177
info[2]=debuglib.lua,177
... in hook line 178
info[2]=debuglib.lua,178
... in hook line 176
info[2]=debuglib.lua,176
... in hook line 195
info[2]=debuglib.lua,195
hook = l -> result=true,nil,nil,nil,false,false,nil
... in hook return nil
info[2]=[C],-1
... in hook line 192
info[2]=debuglib.lua,192
... in hook call nil
info[2]=debuglib.lua,177
... in hook line 177
info[2]=debuglib.lua,177
... in hook line 178
info[2]=debuglib.lua,178
... in hook call nil
info[2]=debuglib.lua,176
... in hook line 176
info[2]=debuglib.lua,176
... in hook call nil
info[2]=[C],-1
... in hook return nil
info[2]=[C],-1
... in hook line 195
info[2]=debuglib.lua,195
... in hook call nil
info[2]=[C],-1
hook = crl -> result=true,nil,nil,nil,false,false,nil
----- debug.traceback
hi
stack traceback:
debuglib.lua:216: in function <debuglib.lua:215>
[C]: in function 'pcall'
debuglib.lua:219: in function 'b'
debuglib.lua:222: in function 'c'
debuglib.lua:225: in function '__index'
debuglib.lua:227: in function 'e'
debuglib.lua:231: in function 'g'
debuglib.lua:235: in function 'i'
debuglib.lua:238: in function <debuglib.lua:214>
[C]: in function 'pcall'
debuglib.lua:240: in main chunk
[C]: in ?
----- debug.upvalueid
debug.getupvalue(a1,1) x 100
debug.getupvalue(a1,2) y 200
debug.getupvalue(a2,1) x 100
debug.getupvalue(a2,2) y 200
debug.upvalueid(a1,1) == debug.upvalueid(a1,1) true
debug.upvalueid(a1,1) == debug.upvalueid(a2,1) true
debug.upvalueid(a1,1) == debug.upvalueid(a1,2) false
----- debug.upvaluejoin
a1 101 201 301 401
a2 102 202 501 601
debug.upvaluejoin(a1,1,a2,2)
debug.upvaluejoin(a1,3,a2,4)
a1 203 203 602 402
a2 103 204 502 603
a1 205 205 604 403
a2 104 206 503 605
debug.getupvalue(a1,1) x 206
debug.getupvalue(a2,1) x 104
debug.upvalueid(a1,1) == debug.upvalueid(a1,1) true
debug.upvalueid(a1,1) == debug.upvalueid(a2,1) false
debug.upvalueid(a2,1) == debug.upvalueid(a1,1) false
debug.upvalueid(a2,1) == debug.upvalueid(a2,1) true
debug.upvalueid(a1,1) == debug.upvalueid(a1,2) true
debug.upvalueid(a1,1) == debug.upvalueid(a2,2) true
debug.upvalueid(a2,1) == debug.upvalueid(a1,2) false
debug.upvalueid(a2,1) == debug.upvalueid(a2,2) false
debug.upvalueid(a1,1) == debug.upvalueid(a1,3) false
debug.upvalueid(a1,1) == debug.upvalueid(a2,3) false
debug.upvalueid(a2,1) == debug.upvalueid(a1,3) false
debug.upvalueid(a2,1) == debug.upvalueid(a2,3) false
debug.upvalueid(a1,1) == debug.upvalueid(a1,4) false
debug.upvalueid(a1,1) == debug.upvalueid(a2,4) false
debug.upvalueid(a2,1) == debug.upvalueid(a1,4) false
debug.upvalueid(a2,1) == debug.upvalueid(a2,4) false
debug.getupvalue(a1,2) y 206
debug.getupvalue(a2,2) y 206
debug.upvalueid(a1,2) == debug.upvalueid(a1,1) true
debug.upvalueid(a1,2) == debug.upvalueid(a2,1) false
debug.upvalueid(a2,2) == debug.upvalueid(a1,1) true
debug.upvalueid(a2,2) == debug.upvalueid(a2,1) false
debug.upvalueid(a1,2) == debug.upvalueid(a1,2) true
debug.upvalueid(a1,2) == debug.upvalueid(a2,2) true
debug.upvalueid(a2,2) == debug.upvalueid(a1,2) true
debug.upvalueid(a2,2) == debug.upvalueid(a2,2) true
debug.upvalueid(a1,2) == debug.upvalueid(a1,3) false
debug.upvalueid(a1,2) == debug.upvalueid(a2,3) false
debug.upvalueid(a2,2) == debug.upvalueid(a1,3) false
debug.upvalueid(a2,2) == debug.upvalueid(a2,3) false
debug.upvalueid(a1,2) == debug.upvalueid(a1,4) false
debug.upvalueid(a1,2) == debug.upvalueid(a2,4) false
debug.upvalueid(a2,2) == debug.upvalueid(a1,4) false
debug.upvalueid(a2,2) == debug.upvalueid(a2,4) false
debug.getupvalue(a1,3) z 605
debug.getupvalue(a2,3) z 503
debug.upvalueid(a1,3) == debug.upvalueid(a1,1) false
debug.upvalueid(a1,3) == debug.upvalueid(a2,1) false
debug.upvalueid(a2,3) == debug.upvalueid(a1,1) false
debug.upvalueid(a2,3) == debug.upvalueid(a2,1) false
debug.upvalueid(a1,3) == debug.upvalueid(a1,2) false
debug.upvalueid(a1,3) == debug.upvalueid(a2,2) false
debug.upvalueid(a2,3) == debug.upvalueid(a1,2) false
debug.upvalueid(a2,3) == debug.upvalueid(a2,2) false
debug.upvalueid(a1,3) == debug.upvalueid(a1,3) true
debug.upvalueid(a1,3) == debug.upvalueid(a2,3) false
debug.upvalueid(a2,3) == debug.upvalueid(a1,3) false
debug.upvalueid(a2,3) == debug.upvalueid(a2,3) true
debug.upvalueid(a1,3) == debug.upvalueid(a1,4) false
debug.upvalueid(a1,3) == debug.upvalueid(a2,4) true
debug.upvalueid(a2,3) == debug.upvalueid(a1,4) false
debug.upvalueid(a2,3) == debug.upvalueid(a2,4) false
debug.getupvalue(a1,4) w 403
debug.getupvalue(a2,4) w 605
debug.upvalueid(a1,4) == debug.upvalueid(a1,1) false
debug.upvalueid(a1,4) == debug.upvalueid(a2,1) false
debug.upvalueid(a2,4) == debug.upvalueid(a1,1) false
debug.upvalueid(a2,4) == debug.upvalueid(a2,1) false
debug.upvalueid(a1,4) == debug.upvalueid(a1,2) false
debug.upvalueid(a1,4) == debug.upvalueid(a2,2) false
debug.upvalueid(a2,4) == debug.upvalueid(a1,2) false
debug.upvalueid(a2,4) == debug.upvalueid(a2,2) false
debug.upvalueid(a1,4) == debug.upvalueid(a1,3) false
debug.upvalueid(a1,4) == debug.upvalueid(a2,3) false
debug.upvalueid(a2,4) == debug.upvalueid(a1,3) true
debug.upvalueid(a2,4) == debug.upvalueid(a2,3) false
debug.upvalueid(a1,4) == debug.upvalueid(a1,4) true
debug.upvalueid(a1,4) == debug.upvalueid(a2,4) false
debug.upvalueid(a2,4) == debug.upvalueid(a1,4) false
debug.upvalueid(a2,4) == debug.upvalueid(a2,4) true

View File

@@ -0,0 +1,97 @@
a(error) false nil
a(error,"msg") false string
a(error,"msg",0) false string
a(error,"msg",1) false string
a(error,"msg",2) false string
a(error,"msg",3) false string
a(error,"msg",4) false string
a(error,"msg",5) false string
a(error,"msg",6) false string
a(nil()) false string
a(t()) false string
a(s()) false string
a(true()) false string
a(nil+1) false string
a(a+1) false string
a(s+1) false string
a(true+1) false string
a(nil.x) false string
a(a.x) false string
a(s.x) true nil
a(true.x) false string
a(nil.x=5) false string
a(a.x=5) false string
a(s.x=5) false string
a(true.x=5) false string
a(#nil) false string
a(#t) true 0
a(#s) true 11
a(#a) false string
a(#true) false string
a(nil>1) false string
a(a>1) false string
a(s>1) false string
a(true>1) false string
a(-nil) false string
a(-a) false string
a(-s) false string
a(-true) false string
-------- string concatenation
"a".."b" true
"a"..nil false
nil.."b" false
"a"..{} false
{}.."b" false
"a"..2 true
2.."b" true
"a"..print false
print.."b" false
"a"..true false
true.."b" false
nil..true false
"a"..3.5 true
3.5.."b" true
-------- table concatenation
"a".."b" true
"a"..nil false
nil.."b" false
"a"..{} false
{}.."b" false
"a"..2 true
2.."b" true
"a"..print false
print.."b" false
"a"..true false
true.."b" false
nil..true false
"a"..3.5 true
3.5.."b" true
-------- pairs tests
a(pairs(nil)) false string
a(pairs(a)) false string
a(pairs(s)) false string
a(pairs(t)) true func.1
a(pairs(true)) false string
-------- setmetatable tests
a(setmetatable(nil)) false string
a(setmetatable(a)) false string
a(setmetatable(s)) false string
a(setmetatable(true)) false string
a(setmetatable(t)) true tbl.2
a(getmetatable(t)) true tbl.3
a(setmetatable(t*)) true tbl.2
a(getmetatable(t)) true tbl.4
a(setmetatable(t)) false string
a(getmetatable(t)) true tbl.4
a(setmetatable(t)) true tbl.5
a(getmetatable(t)) true tbl.6
a(setmetatable(t*)) true tbl.5
a(getmetatable(t)) true some string
a(setmetatable(t)) false string
a(getmetatable(t)) true some string
a(setmetatable(t,nil)) false string
a(setmetatable(t)) false string
a(setmetatable({},"abc")) false string
error("msg","arg") false string
loadfile("bogus.txt") true nil
dofile("bogus.txt") false string

View File

@@ -0,0 +1,68 @@
f0:
f0:
f0:
f0:
f0:
f1: nil
f1: a1/1
f1: a1/2
f1: a1/3
f1: a1/4
f2: nil nil
f2: a1/1 nil
f2: a1/2 a2/2
f2: a1/3 a2/3
f2: a1/4 a2/4
f3: nil nil nil
f3: a1/1 nil nil
f3: a1/2 a2/2 nil
f3: a1/3 a2/3 a3/3
f3: a1/4 a2/4 a3/4
f4: nil nil nil nil
f4: a1/1 nil nil nil
f4: a1/2 a2/2 nil nil
f4: a1/3 a2/3 a3/3 nil
f4: a1/4 a2/4 a3/4 a4/4
z0: nil
z2: c2.3/4
z4: c4.1/4
g0: nil nil nil nil (eol)
g2: b2.3/4 b2.4/4 nil nil (eol)
g4: b4.1/4 b4.2/4 b4.3/4 b4.4/4 (eol)
11 12 13
23 22 21
32 45 58
a nil
...
...,a nil nil
a,... nil
a q
...
...,a nil q
a,... q
a q
... r
...,a r q
a,... q r
a q
... r s
...,a r q
a,... q r s
third abc nil | nil nil nil
third def nil | nil nil nil
third def nil | nil nil nil
third abc p | p nil nil
third def nil | p nil nil
third def nil | p nil nil
third abc p | p q nil
third def q | p q nil
third def q | p q nil
third abc p | p q r
third def q | p q r
third def q | p q r
third abc p | p q r
third def q | p q r
third def q | p q r
third abc nil | nil nil nil
third def nil | nil nil nil
third def nil | nil nil nil

View File

@@ -0,0 +1,96 @@
true
true
true
true
true
write file.0
Thiswrite file.0
is a pen.write file.0
flush true
f userdata
file.1
write file.2
type(f) file.1
close true
type(f) closed file
type("f") nil
"abc" string
----- 1
"def" string
----- 2
"12345" number
----- 3
"678910" number
----- 4
" more\7aaaaaa\8bbbthe rest" string
----- 5
h file.1 file.4 nil
write file.3
close true
j file.1
seek 3
read def 123
seek 2
read cdef 12
seek 1
read bcde f 1
seek(cur,0) 8
seek(cur,20) 28
seek(end,-5) 73
read(4) "text"
read(4) "."
read(4) "nil"
close true
f.type file.5
f file.6
write file.6
type(f) file.5
close true
"line one"
"line two"
""
"after blank line"
"unterminated line"
"line one"
"line two"
""
"after blank line"
"unterminated line"
"line one"
"line two"
""
"after blank line"
"unterminated line"
"line one"
"line two"
""
"after blank line"
"unterminated line"
file.7
file.7
a:write file.8
b:write file.9
a:setvbuf true
a:setvbuf true
a:setvbuf true
a:write file.8
b:write file.9
a:flush true
b:flush true
a:close true
a:write false closed
a:flush false closed
a:read false closed
a:lines false closed
a:seek false closed
a:setvbuf false closed
a:close false closed
io.type(a) true
io.close() true
io.close(io.output()) true
io.close() true
io.write false closed
io.flush false closed
io.close false closed
io.read false closed
io.lines false closed

View File

@@ -0,0 +1,321 @@
has debug true
----- debug.getlocal, debug.setlocal
true h-3-0 -> 3-0 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={3,0,#} f locals=,3,0,#,4,5,6
true h-3-1 -> 3-1 get=a,3 set=a,nil get=a,# g locals=7,8,9 tbl={3,1,#} f locals=,#,1,#,4,5,6
true h-3-2 -> 3-2 get=b,2 set=b,nil get=b,# g locals=7,8,9 tbl={3,2,#} f locals=,3,#,#,4,5,6
true h-3-3 -> 3-3 get=c,# set=c,nil get=c,# g locals=7,8,9 tbl={3,3,#} f locals=,3,3,#,4,5,6
true h-3-4 -> 3-4 get=d,4 set=d,nil get=d,# g locals=7,8,9 tbl={3,4,#} f locals=,3,4,#,#,5,6
true h-3-5 -> 3-5 get=e,5 set=e,nil get=e,# g locals=7,8,9 tbl={3,5,#} f locals=,3,5,#,4,#,6
true h-3-6 -> 3-6 get=f,6 set=f,nil get=f,# g locals=7,8,9 tbl={3,6,#} f locals=,3,6,#,4,5,#
true h-3-7 -> 3-7 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={3,7,#} f locals=,3,7,#,4,5,6
true h-2-0 -> 2-0 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,0,#} f locals=,2,0,#,4,5,6
true h-2-1 -> 2-1 get=p,7 set=p,nil get=p,# g locals=#,8,9 tbl={2,1,#} f locals=,2,1,#,4,5,6
true h-2-2 -> 2-2 get=q,8 set=q,nil get=q,# g locals=7,#,9 tbl={2,2,#} f locals=,2,2,#,4,5,6
true h-2-3 -> 2-3 get=r,9 set=r,nil get=r,# g locals=7,8,# tbl={2,3,#} f locals=,2,3,#,4,5,6
true h-2-4 -> 2-4 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,4,#} f locals=,2,4,#,4,5,6
true h-2-5 -> 2-5 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,5,#} f locals=,2,5,#,4,5,6
true h-2-6 -> 2-6 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,6,#} f locals=,2,6,#,4,5,6
true h-2-7 -> 2-7 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,7,#} f locals=,2,7,#,4,5,6
true h-1-3 -> 1-3 get=n,# set=n,nil get=n,# g locals=7,8,9 tbl={1,3,#} f locals=,1,3,#,4,5,6
true h-1-4 -> 1-4 get=#,nil set=x1,nil get=x1,# g locals=7,8,9 tbl={1,4,#} f locals=,1,4,#,4,5,6
true h-1-5 -> 1-5 get=nil,# set=y1,nil get=y1,# g locals=7,8,9 tbl={1,5,#} f locals=,1,5,#,4,5,6
true h-1-6 -> 1-6 get=nil,nil set=nil,nil get=x2,nil g locals=7,8,9 tbl={1,6,#} f locals=,1,6,#,4,5,6
true h-1-7 -> 1-7 get=nil,nil set=nil,nil get=y2,nil g locals=7,8,9 tbl={1,7,#} f locals=,1,7,#,4,5,6
----- debug.getupvalue, debug.setupvalue
h 101 102 103 104 105 106 107 108 109
f -> 1-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,101,102,103,104,105,106,107,108,109
f -> 1-1 get=true,m,101 set=true,m,nil get=true,m,777001 tbl=true,777001,102,103,104,105,106,107,108,109
f -> 1-2 get=true,n,102 set=true,n,nil get=true,n,777002 tbl=true,777001,777002,103,104,105,106,107,108,109
f -> 1-3 get=true,o,103 set=true,o,nil get=true,o,777003 tbl=true,777001,777002,777003,104,105,106,107,108,109
f -> 1-4 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
f -> 1-5 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
f -> 1-6 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
f -> 1-7 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
f -> 1-8 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
f -> 1-9 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
f -> 1-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
g -> 2-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
g -> 2-1 get=true,m,777001 set=true,m,nil get=true,m,888001 tbl=true,888001,777002,777003,104,105,106,107,108,109
g -> 2-2 get=true,n,777002 set=true,n,nil get=true,n,888002 tbl=true,888001,888002,777003,104,105,106,107,108,109
g -> 2-3 get=true,o,777003 set=true,o,nil get=true,o,888003 tbl=true,888001,888002,888003,104,105,106,107,108,109
g -> 2-4 get=true,p,104 set=true,p,nil get=true,p,888004 tbl=true,888001,888002,888003,888004,105,106,107,108,109
g -> 2-5 get=true,q,105 set=true,q,nil get=true,q,888005 tbl=true,888001,888002,888003,888004,888005,106,107,108,109
g -> 2-6 get=true,r,106 set=true,r,nil get=true,r,888006 tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
g -> 2-7 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
g -> 2-8 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
g -> 2-9 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
g -> 2-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
h -> 3-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
h -> 3-1 get=true,m,888001 set=true,m,nil get=true,m,999001 tbl=true,999001,888002,888003,888004,888005,888006,107,108,109
h -> 3-2 get=true,n,888002 set=true,n,nil get=true,n,999002 tbl=true,999001,999002,888003,888004,888005,888006,107,108,109
h -> 3-3 get=true,o,888003 set=true,o,nil get=true,o,999003 tbl=true,999001,999002,999003,888004,888005,888006,107,108,109
h -> 3-4 get=true,p,888004 set=true,p,nil get=true,p,999004 tbl=true,999001,999002,999003,999004,888005,888006,107,108,109
h -> 3-5 get=true,q,888005 set=true,q,nil get=true,q,999005 tbl=true,999001,999002,999003,999004,999005,888006,107,108,109
h -> 3-6 get=true,r,888006 set=true,r,nil get=true,r,999006 tbl=true,999001,999002,999003,999004,999005,999006,107,108,109
h -> 3-7 get=true,v,107 set=true,v,nil get=true,v,999007 tbl=true,999001,999002,999003,999004,999005,999006,999007,108,109
h -> 3-8 get=true,w,108 set=true,w,nil get=true,w,999008 tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,109
h -> 3-9 get=true,x,109 set=true,x,nil get=true,x,999009 tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,999009
h -> 3-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,999009
----- debug.setmetatable, debug.getmetatable
a.a=bbb a.b=nil b.a=nil b.b=nil
a.a=bbb a.b=ccc b.a=nil b.b=nil
boolean table nil table
boolean nil nil nil
boolean boolean nil nil
a.a=bbb a.b=nil b.a=nil b.b=nil
boolean nil nil nil
get=true,true,nil
set=true,false,nil
get=true,true,nil
get=true,true,nil
set=true,false,nil
get=true,true,nil
true nil
true true
true true
----- debug.getinfo
6
---
debug.getinfo(1)
source: @debuglib.lua
short_src: debuglib.lua
what: Lua
currentline: 144
linedefined: 141
lastlinedefined: 155
nups: 4
func: function
debug.getinfo(1,"")
debug.getinfo(1,"l")
currentline: 146
debug.getinfo(1,"fL")
func: function
activelines: {}
debug.getinfo(2)
source: @debuglib.lua
short_src: debuglib.lua
what: Lua
currentline: 157
linedefined: 135
lastlinedefined: 159
nups: 5
func: function
debug.getinfo(2,"l")
currentline: 157
debug.getinfo(2,"fL")
func: function
activelines: {}
debug.getinfo(10,"")
true
debug.getinfo(-10,"")
true
---
5
e,f,g true function function
debug.getinfo(f)
true
source: @debuglib.lua
short_src: debuglib.lua
what: Lua
currentline: -1
linedefined: 137
lastlinedefined: 140
nups: 1
func: function
debug.getinfo(f,"nSlufL")
true
source: @debuglib.lua
short_src: debuglib.lua
what: Lua
currentline: -1
linedefined: 137
lastlinedefined: 140
nups: 1
func: function
activelines: {}
debug.getinfo(f,"n")
true
debug.getinfo(f,"S")
true
source: @debuglib.lua
short_src: debuglib.lua
what: Lua
linedefined: 137
lastlinedefined: 140
debug.getinfo(f,"l")
true
currentline: -1
debug.getinfo(f,"u")
true
nups: 1
debug.getinfo(f,"f")
true
func: function
debug.getinfo(f,"L")
true
activelines: {}
debug.getinfo(g)
true
source: @debuglib.lua
short_src: debuglib.lua
what: Lua
currentline: -1
linedefined: 141
lastlinedefined: 155
nups: 4
func: function
debug.getinfo(test)
true
source: @debuglib.lua
short_src: debuglib.lua
what: Lua
currentline: -1
linedefined: 135
lastlinedefined: 159
nups: 5
func: function
----- debug.sethook, debug.gethook
... in hook call nil
info[2]=debuglib.lua,174
... in hook call nil
info[2]=debuglib.lua,175
... in hook call nil
info[2]=[C],-1
... in hook call nil
info[2]=[C],-1
hook = c -> result=true,nil,nil,nil,false,false,nil
hook = r -> result=true,nil,nil,nil,false,false,nil
... in hook line 192
info[2]=debuglib.lua,192
... in hook line 177
info[2]=debuglib.lua,177
... in hook line 178
info[2]=debuglib.lua,178
... in hook line 176
info[2]=debuglib.lua,176
... in hook line 195
info[2]=debuglib.lua,195
hook = l -> result=true,nil,nil,nil,false,false,nil
... in hook line 192
info[2]=debuglib.lua,192
... in hook call nil
info[2]=debuglib.lua,174
... in hook line 177
info[2]=debuglib.lua,177
... in hook line 178
info[2]=debuglib.lua,178
... in hook call nil
info[2]=debuglib.lua,175
... in hook line 176
info[2]=debuglib.lua,176
... in hook call nil
info[2]=[C],-1
... in hook line 195
info[2]=debuglib.lua,195
... in hook call nil
info[2]=[C],-1
hook = crl -> result=true,nil,nil,nil,false,false,nil
----- debug.traceback
hi
stack traceback:
debuglib.lua:216: in function <debuglib.lua:215>
[C]: in function 'pcall'
debuglib.lua:219: in function 'b'
debuglib.lua:222: in function 'c'
debuglib.lua:225: in function '__index'
debuglib.lua:227: in function 'e'
debuglib.lua:231: in function 'g'
debuglib.lua:235: in function 'i'
debuglib.lua:238: in function <debuglib.lua:214>
[C]: in function 'pcall'
debuglib.lua:240: in main chunk
[C]: at 0x55eaaf4e2f20
----- debug.upvalueid
debug.getupvalue(a1,1) x 100
debug.getupvalue(a1,2) y 200
debug.getupvalue(a2,1) x 100
debug.getupvalue(a2,2) y 200
debug.upvalueid(a1,1) == debug.upvalueid(a1,1) true
debug.upvalueid(a1,1) == debug.upvalueid(a2,1) true
debug.upvalueid(a1,1) == debug.upvalueid(a1,2) false
----- debug.upvaluejoin
a1 101 201 301 401
a2 102 202 501 601
debug.upvaluejoin(a1,1,a2,2)
debug.upvaluejoin(a1,3,a2,4)
a1 203 203 602 402
a2 103 204 502 603
a1 205 205 604 403
a2 104 206 503 605
debug.getupvalue(a1,1) x 206
debug.getupvalue(a2,1) x 104
debug.upvalueid(a1,1) == debug.upvalueid(a1,1) true
debug.upvalueid(a1,1) == debug.upvalueid(a2,1) false
debug.upvalueid(a2,1) == debug.upvalueid(a1,1) false
debug.upvalueid(a2,1) == debug.upvalueid(a2,1) true
debug.upvalueid(a1,1) == debug.upvalueid(a1,2) true
debug.upvalueid(a1,1) == debug.upvalueid(a2,2) true
debug.upvalueid(a2,1) == debug.upvalueid(a1,2) false
debug.upvalueid(a2,1) == debug.upvalueid(a2,2) false
debug.upvalueid(a1,1) == debug.upvalueid(a1,3) false
debug.upvalueid(a1,1) == debug.upvalueid(a2,3) false
debug.upvalueid(a2,1) == debug.upvalueid(a1,3) false
debug.upvalueid(a2,1) == debug.upvalueid(a2,3) false
debug.upvalueid(a1,1) == debug.upvalueid(a1,4) false
debug.upvalueid(a1,1) == debug.upvalueid(a2,4) false
debug.upvalueid(a2,1) == debug.upvalueid(a1,4) false
debug.upvalueid(a2,1) == debug.upvalueid(a2,4) false
debug.getupvalue(a1,2) y 206
debug.getupvalue(a2,2) y 206
debug.upvalueid(a1,2) == debug.upvalueid(a1,1) true
debug.upvalueid(a1,2) == debug.upvalueid(a2,1) false
debug.upvalueid(a2,2) == debug.upvalueid(a1,1) true
debug.upvalueid(a2,2) == debug.upvalueid(a2,1) false
debug.upvalueid(a1,2) == debug.upvalueid(a1,2) true
debug.upvalueid(a1,2) == debug.upvalueid(a2,2) true
debug.upvalueid(a2,2) == debug.upvalueid(a1,2) true
debug.upvalueid(a2,2) == debug.upvalueid(a2,2) true
debug.upvalueid(a1,2) == debug.upvalueid(a1,3) false
debug.upvalueid(a1,2) == debug.upvalueid(a2,3) false
debug.upvalueid(a2,2) == debug.upvalueid(a1,3) false
debug.upvalueid(a2,2) == debug.upvalueid(a2,3) false
debug.upvalueid(a1,2) == debug.upvalueid(a1,4) false
debug.upvalueid(a1,2) == debug.upvalueid(a2,4) false
debug.upvalueid(a2,2) == debug.upvalueid(a1,4) false
debug.upvalueid(a2,2) == debug.upvalueid(a2,4) false
debug.getupvalue(a1,3) z 605
debug.getupvalue(a2,3) z 503
debug.upvalueid(a1,3) == debug.upvalueid(a1,1) false
debug.upvalueid(a1,3) == debug.upvalueid(a2,1) false
debug.upvalueid(a2,3) == debug.upvalueid(a1,1) false
debug.upvalueid(a2,3) == debug.upvalueid(a2,1) false
debug.upvalueid(a1,3) == debug.upvalueid(a1,2) false
debug.upvalueid(a1,3) == debug.upvalueid(a2,2) false
debug.upvalueid(a2,3) == debug.upvalueid(a1,2) false
debug.upvalueid(a2,3) == debug.upvalueid(a2,2) false
debug.upvalueid(a1,3) == debug.upvalueid(a1,3) true
debug.upvalueid(a1,3) == debug.upvalueid(a2,3) false
debug.upvalueid(a2,3) == debug.upvalueid(a1,3) false
debug.upvalueid(a2,3) == debug.upvalueid(a2,3) true
debug.upvalueid(a1,3) == debug.upvalueid(a1,4) false
debug.upvalueid(a1,3) == debug.upvalueid(a2,4) true
debug.upvalueid(a2,3) == debug.upvalueid(a1,4) false
debug.upvalueid(a2,3) == debug.upvalueid(a2,4) false
debug.getupvalue(a1,4) w 403
debug.getupvalue(a2,4) w 605
debug.upvalueid(a1,4) == debug.upvalueid(a1,1) false
debug.upvalueid(a1,4) == debug.upvalueid(a2,1) false
debug.upvalueid(a2,4) == debug.upvalueid(a1,1) false
debug.upvalueid(a2,4) == debug.upvalueid(a2,1) false
debug.upvalueid(a1,4) == debug.upvalueid(a1,2) false
debug.upvalueid(a1,4) == debug.upvalueid(a2,2) false
debug.upvalueid(a2,4) == debug.upvalueid(a1,2) false
debug.upvalueid(a2,4) == debug.upvalueid(a2,2) false
debug.upvalueid(a1,4) == debug.upvalueid(a1,3) false
debug.upvalueid(a1,4) == debug.upvalueid(a2,3) false
debug.upvalueid(a2,4) == debug.upvalueid(a1,3) true
debug.upvalueid(a2,4) == debug.upvalueid(a2,3) false
debug.upvalueid(a1,4) == debug.upvalueid(a1,4) true
debug.upvalueid(a1,4) == debug.upvalueid(a2,4) false
debug.upvalueid(a2,4) == debug.upvalueid(a1,4) false
debug.upvalueid(a2,4) == debug.upvalueid(a2,4) true

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,842 @@
---------- miscellaneous tests ----------
math.sin( 0.0 ) true <zero>
math.cos( math.pi ) true -1
math.sqrt( 9.0 ) true 3
math.modf( 5.25 ) true 5 0.25
math.frexp(0.00625) true 0.8 -7
-5 ^ 2 true -25
-5 / 2 true -2.5
-5 % 2 true 1
---------- constants ----------
math.huge true <pos-inf>
math.pi true 3.1415
---------- unary operator - ----------
--2.5 true
--2 true
-0 true <zero>
-2 true -2
-2.5 true -2.5
-'-2.5' true 2.5
-'-2' true 2
-'0' true <zero>
-'2' true -2
-'2.5' true -2.5
---------- unary operator not ----------
not -2.5 true false
not -2 true false
not 0 true false
not 2 true false
not 2.5 true false
not '-2.5' true false
not '-2' true false
not '0' true false
not '2' true false
not '2.5' true false
---------- binary operator + ----------
2+0 true 2
-2.5+0 true -2.5
2+1 true 3
5+2 true 7
-5+2 true -3
16+2 true 18
-16+-2 true -18
0.5+0 true 0.5
0.5+1 true 1.5
0.5+2 true 2.5
0.5+-1 true -0.5
0.5+2 true 2.5
2.25+0 true 2.25
2.25+2 true 4.25
-2+0 true -2
3+3 true 6
'2'+'0' true 2
'2.5'+'3' true 5.5
'-2'+'1.5' true -0.5
'-2.5'+'-1.5' true -4
'3.0'+'3.0' true 6
2.75+2.75 true 5.5
'2.75'+'2.75' true 5.5
3+'3' true 6
'3'+3 true 6
2.75+'2.75' true 5.5
'2.75'+2.75 true 5.5
-3+'-4' true -7
'-3'+4 true 1
-3+'4' true 1
'-3'+-4 true -7
-4.75+'2.75' true -2
'-2.75'+1.75 true -1
4.75+'-2.75' true 2
'2.75'+-1.75 true 1
---------- binary operator - ----------
2-0 true 2
-2.5-0 true -2.5
2-1 true 1
5-2 true 3
-5-2 true -7
16-2 true 14
-16--2 true -14
0.5-0 true 0.5
0.5-1 true -0.5
0.5-2 true -1.5
0.5--1 true 1.5
0.5-2 true -1.5
2.25-0 true 2.25
2.25-2 true 0.25
-2-0 true -2
3-3 true <zero>
'2'-'0' true 2
'2.5'-'3' true -0.5
'-2'-'1.5' true -3.5
'-2.5'-'-1.5' true -1
'3.0'-'3.0' true <zero>
2.75-2.75 true <zero>
'2.75'-'2.75' true <zero>
3-'3' true <zero>
'3'-3 true <zero>
2.75-'2.75' true <zero>
'2.75'-2.75 true <zero>
-3-'-4' true 1
'-3'-4 true -7
-3-'4' true -7
'-3'--4 true 1
-4.75-'2.75' true -7.5
'-2.75'-1.75 true -4.5
4.75-'-2.75' true 7.5
'2.75'--1.75 true 4.5
---------- binary operator * ----------
2*0 true <zero>
-2.5*0 true <zero>
2*1 true 2
5*2 true 10
-5*2 true -10
16*2 true 32
-16*-2 true 32
0.5*0 true <zero>
0.5*1 true 0.5
0.5*2 true 1
0.5*-1 true -0.5
0.5*2 true 1
2.25*0 true <zero>
2.25*2 true 4.5
-2*0 true <zero>
3*3 true 9
'2'*'0' true <zero>
'2.5'*'3' true 7.5
'-2'*'1.5' true -3
'-2.5'*'-1.5' true 3.75
'3.0'*'3.0' true 9
2.75*2.75 true 7.5625
'2.75'*'2.75' true 7.5625
3*'3' true 9
'3'*3 true 9
2.75*'2.75' true 7.5625
'2.75'*2.75 true 7.5625
-3*'-4' true 12
'-3'*4 true -12
-3*'4' true -12
'-3'*-4 true 12
-4.75*'2.75' true -13.06
'-2.75'*1.75 true -4.812
4.75*'-2.75' true -13.06
'2.75'*-1.75 true -4.812
---------- binary operator ^ ----------
2^0 true 1
-2.5^0 true 1
2^1 true 2
5^2 true 25
-5^2 true 25
16^2 true 256
-16^-2 true 0.0039
0.5^0 true 1
0.5^1 true 0.5
0.5^2 true 0.25
0.5^-1 true 2
0.5^2 true 0.25
2.25^0 true 1
2.25^2 true 5.0625
-2^0 true 1
3^3 true 27
'2'^'0' true 1
'2.5'^'3' true 15.625
'-2'^'1.5' true <nan>
'-2.5'^'-1.5' true <nan>
'3.0'^'3.0' true 27
2.75^2.75 true 16.149
'2.75'^'2.75' true 16.149
3^'3' true 27
'3'^3 true 27
2.75^'2.75' true 16.149
'2.75'^2.75 true 16.149
-3^'-4' true 0.0123
'-3'^4 true 81
-3^'4' true 81
'-3'^-4 true 0.0123
-4.75^'2.75' true <nan>
'-2.75'^1.75 true <nan>
4.75^'-2.75' true 0.0137
'2.75'^-1.75 true 0.1702
---------- binary operator / ----------
2/0 true <pos-inf>
-2.5/0 true <neg-inf>
2/1 true 2
5/2 true 2.5
-5/2 true -2.5
16/2 true 8
-16/-2 true 8
0.5/0 true <pos-inf>
0.5/1 true 0.5
0.5/2 true 0.25
0.5/-1 true -0.5
0.5/2 true 0.25
2.25/0 true <pos-inf>
2.25/2 true 1.125
-2/0 true <neg-inf>
3/3 true 1
'2'/'0' true <pos-inf>
'2.5'/'3' true 0.8333
'-2'/'1.5' true -1.333
'-2.5'/'-1.5' true 1.6666
'3.0'/'3.0' true 1
2.75/2.75 true 1
'2.75'/'2.75' true 1
3/'3' true 1
'3'/3 true 1
2.75/'2.75' true 1
'2.75'/2.75 true 1
-3/'-4' true 0.75
'-3'/4 true -0.75
-3/'4' true -0.75
'-3'/-4 true 0.75
-4.75/'2.75' true -1.727
'-2.75'/1.75 true -1.571
4.75/'-2.75' true -1.727
'2.75'/-1.75 true -1.571
---------- binary operator % ----------
2%0 true <nan>
-2.5%0 true <nan>
2%1 true <zero>
5%2 true 1
-5%2 true 1
16%2 true <zero>
-16%-2 true <zero>
0.5%0 true <nan>
0.5%1 true 0.5
0.5%2 true 0.5
0.5%-1 true -0.5
0.5%2 true 0.5
2.25%0 true <nan>
2.25%2 true 0.25
-2%0 true <nan>
3%3 true <zero>
'2'%'0' true <nan>
'2.5'%'3' true 2.5
'-2'%'1.5' true 1
'-2.5'%'-1.5' true -1
'3.0'%'3.0' true <zero>
2.75%2.75 true <zero>
'2.75'%'2.75' true <zero>
3%'3' true <zero>
'3'%3 true <zero>
2.75%'2.75' true <zero>
'2.75'%2.75 true <zero>
-3%'-4' true -3
'-3'%4 true 1
-3%'4' true 1
'-3'%-4 true -3
-4.75%'2.75' true 0.75
'-2.75'%1.75 true 0.75
4.75%'-2.75' true -0.75
'2.75'%-1.75 true -0.75
---------- binary operator == ----------
2==0 true false
-2.5==0 true false
2==1 true false
5==2 true false
-5==2 true false
16==2 true false
-16==-2 true false
0.5==0 true false
0.5==1 true false
0.5==2 true false
0.5==-1 true false
0.5==2 true false
2.25==0 true false
2.25==2 true false
-2==0 true false
3==3 true true
'2'=='0' true false
'2.5'=='3' true false
'-2'=='1.5' true false
'-2.5'=='-1.5' true false
'3.0'=='3.0' true true
2.75==2.75 true true
'2.75'=='2.75' true true
---------- binary operator ~= ----------
2~=0 true true
-2.5~=0 true true
2~=1 true true
5~=2 true true
-5~=2 true true
16~=2 true true
-16~=-2 true true
0.5~=0 true true
0.5~=1 true true
0.5~=2 true true
0.5~=-1 true true
0.5~=2 true true
2.25~=0 true true
2.25~=2 true true
-2~=0 true true
3~=3 true false
'2'~='0' true true
'2.5'~='3' true true
'-2'~='1.5' true true
'-2.5'~='-1.5' true true
'3.0'~='3.0' true false
2.75~=2.75 true false
'2.75'~='2.75' true false
---------- binary operator > ----------
2>0 true true
-2.5>0 true false
2>1 true true
5>2 true true
-5>2 true false
16>2 true true
-16>-2 true false
0.5>0 true true
0.5>1 true false
0.5>2 true false
0.5>-1 true true
0.5>2 true false
2.25>0 true true
2.25>2 true true
-2>0 true false
3>3 true false
'2'>'0' true true
'2.5'>'3' true false
'-2'>'1.5' true false
'-2.5'>'-1.5' true true
'3.0'>'3.0' true false
2.75>2.75 true false
'2.75'>'2.75' true false
---------- binary operator < ----------
2<0 true false
-2.5<0 true true
2<1 true false
5<2 true false
-5<2 true true
16<2 true false
-16<-2 true true
0.5<0 true false
0.5<1 true true
0.5<2 true true
0.5<-1 true false
0.5<2 true true
2.25<0 true false
2.25<2 true false
-2<0 true true
3<3 true false
'2'<'0' true false
'2.5'<'3' true true
'-2'<'1.5' true true
'-2.5'<'-1.5' true false
'3.0'<'3.0' true false
2.75<2.75 true false
'2.75'<'2.75' true false
---------- binary operator >= ----------
2>=0 true true
-2.5>=0 true false
2>=1 true true
5>=2 true true
-5>=2 true false
16>=2 true true
-16>=-2 true false
0.5>=0 true true
0.5>=1 true false
0.5>=2 true false
0.5>=-1 true true
0.5>=2 true false
2.25>=0 true true
2.25>=2 true true
-2>=0 true false
3>=3 true true
'2'>='0' true true
'2.5'>='3' true false
'-2'>='1.5' true false
'-2.5'>='-1.5' true true
'3.0'>='3.0' true true
2.75>=2.75 true true
'2.75'>='2.75' true true
---------- binary operator <= ----------
2<=0 true false
-2.5<=0 true true
2<=1 true false
5<=2 true false
-5<=2 true true
16<=2 true false
-16<=-2 true true
0.5<=0 true false
0.5<=1 true true
0.5<=2 true true
0.5<=-1 true false
0.5<=2 true true
2.25<=0 true false
2.25<=2 true false
-2<=0 true true
3<=3 true true
'2'<='0' true false
'2.5'<='3' true true
'-2'<='1.5' true true
'-2.5'<='-1.5' true false
'3.0'<='3.0' true true
2.75<=2.75 true true
'2.75'<='2.75' true true
---------- math.abs ----------
math.abs(-2.5) true 2.5
math.abs(-2) true 2
math.abs(0) true <zero>
math.abs(2) true 2
math.abs(2.5) true 2.5
math.abs('-2.5') true 2.5
math.abs('-2') true 2
math.abs('0') true <zero>
math.abs('2') true 2
math.abs('2.5') true 2.5
---------- math.ceil ----------
math.ceil(-2.5) true -2
math.ceil(-2) true -2
math.ceil(0) true <zero>
math.ceil(2) true 2
math.ceil(2.5) true 3
math.ceil('-2.5') true -2
math.ceil('-2') true -2
math.ceil('0') true <zero>
math.ceil('2') true 2
math.ceil('2.5') true 3
---------- math.cos ----------
math.cos(-2.5) true -0.801
math.cos(-2) true -0.416
math.cos(0) true 1
math.cos(2) true -0.416
math.cos(2.5) true -0.801
math.cos('-2.5') true -0.801
math.cos('-2') true -0.416
math.cos('0') true 1
math.cos('2') true -0.416
math.cos('2.5') true -0.801
---------- math.deg ----------
math.deg(-2.5) true -143.2
math.deg(-2) true -114.5
math.deg(0) true <zero>
math.deg(2) true 114.59
math.deg(2.5) true 143.23
math.deg('-2.5') true -143.2
math.deg('-2') true -114.5
math.deg('0') true <zero>
math.deg('2') true 114.59
math.deg('2.5') true 143.23
---------- math.exp ----------
math.exp(-2.5) true 0.0820
math.exp(-2) true 0.1353
math.exp(0) true 1
math.exp(2) true 7.3890
math.exp(2.5) true 12.182
math.exp('-2.5') true 0.0820
math.exp('-2') true 0.1353
math.exp('0') true 1
math.exp('2') true 7.3890
math.exp('2.5') true 12.182
---------- math.floor ----------
math.floor(-2.5) true -3
math.floor(-2) true -2
math.floor(0) true <zero>
math.floor(2) true 2
math.floor(2.5) true 2
math.floor('-2.5') true -3
math.floor('-2') true -2
math.floor('0') true <zero>
math.floor('2') true 2
math.floor('2.5') true 2
---------- math.frexp ----------
math.frexp(-2.5) true -0.625 2
math.frexp(-2) true -0.5 2
math.frexp(0) true <zero> <zero>
math.frexp(2) true 0.5 2
math.frexp(2.5) true 0.625 2
math.frexp('-2.5') true -0.625 2
math.frexp('-2') true -0.5 2
math.frexp('0') true <zero> <zero>
math.frexp('2') true 0.5 2
math.frexp('2.5') true 0.625 2
---------- math.modf ----------
math.modf(-2.5) true -2 -0.5
math.modf(-2) true -2 <zero>
math.modf(0) true <zero> <zero>
math.modf(2) true 2 <zero>
math.modf(2.5) true 2 0.5
math.modf('-2.5') true -2 -0.5
math.modf('-2') true -2 <zero>
math.modf('0') true <zero> <zero>
math.modf('2') true 2 <zero>
math.modf('2.5') true 2 0.5
---------- math.rad ----------
math.rad(-2.5) true -0.043
math.rad(-2) true -0.034
math.rad(0) true <zero>
math.rad(2) true 0.0349
math.rad(2.5) true 0.0436
math.rad('-2.5') true -0.043
math.rad('-2') true -0.034
math.rad('0') true <zero>
math.rad('2') true 0.0349
math.rad('2.5') true 0.0436
---------- math.sin ----------
math.sin(-2.5) true -0.598
math.sin(-2) true -0.909
math.sin(0) true <zero>
math.sin(2) true 0.9092
math.sin(2.5) true 0.5984
math.sin('-2.5') true -0.598
math.sin('-2') true -0.909
math.sin('0') true <zero>
math.sin('2') true 0.9092
math.sin('2.5') true 0.5984
---------- math.sqrt ----------
math.sqrt(-2.5) true <nan>
math.sqrt(-2) true <nan>
math.sqrt(0) true <zero>
math.sqrt(2) true 1.4142
math.sqrt(2.5) true 1.5811
math.sqrt('-2.5') true <nan>
math.sqrt('-2') true <nan>
math.sqrt('0') true <zero>
math.sqrt('2') true 1.4142
math.sqrt('2.5') true 1.5811
---------- math.tan ----------
math.tan(-2.5) true 0.7470
math.tan(-2) true 2.1850
math.tan(0) true <zero>
math.tan(2) true -2.185
math.tan(2.5) true -0.747
math.tan('-2.5') true 0.7470
math.tan('-2') true 2.1850
math.tan('0') true <zero>
math.tan('2') true -2.185
math.tan('2.5') true -0.747
---------- math.acos (jse only) ----------
math.acos(-2.5) true <nan>
math.acos(-2) true <nan>
math.acos(0) true 1.5707
math.acos(2) true <nan>
math.acos(2.5) true <nan>
math.acos('-2.5') true <nan>
math.acos('-2') true <nan>
math.acos('0') true 1.5707
math.acos('2') true <nan>
math.acos('2.5') true <nan>
---------- math.asin (jse only) ----------
math.asin(-2.5) true <nan>
math.asin(-2) true <nan>
math.asin(0) true <zero>
math.asin(2) true <nan>
math.asin(2.5) true <nan>
math.asin('-2.5') true <nan>
math.asin('-2') true <nan>
math.asin('0') true <zero>
math.asin('2') true <nan>
math.asin('2.5') true <nan>
---------- math.atan (jse only) ----------
math.atan(-2.5) true -1.190
math.atan(-2) true -1.107
math.atan(0) true <zero>
math.atan(2) true 1.1071
math.atan(2.5) true 1.1902
math.atan('-2.5') true -1.190
math.atan('-2') true -1.107
math.atan('0') true <zero>
math.atan('2') true 1.1071
math.atan('2.5') true 1.1902
---------- math.cosh (jse only) ----------
math.cosh(-2.5) true 6.1322
math.cosh(-2) true 3.7621
math.cosh(0) true 1
math.cosh(2) true 3.7621
math.cosh(2.5) true 6.1322
math.cosh('-2.5') true 6.1322
math.cosh('-2') true 3.7621
math.cosh('0') true 1
math.cosh('2') true 3.7621
math.cosh('2.5') true 6.1322
---------- math.log (jse only) ----------
math.log(-2.5) true <nan>
math.log(-2) true <nan>
math.log(0) true <neg-inf>
math.log(2) true 0.6931
math.log(2.5) true 0.9162
math.log('-2.5') true <nan>
math.log('-2') true <nan>
math.log('0') true <neg-inf>
math.log('2') true 0.6931
math.log('2.5') true 0.9162
---------- math.sinh (jse only) ----------
math.sinh(-2.5) true -6.050
math.sinh(-2) true -3.626
math.sinh(0) true <zero>
math.sinh(2) true 3.6268
math.sinh(2.5) true 6.0502
math.sinh('-2.5') true -6.050
math.sinh('-2') true -3.626
math.sinh('0') true <zero>
math.sinh('2') true 3.6268
math.sinh('2.5') true 6.0502
---------- math.tanh (jse only) ----------
math.tanh(-2.5) true -0.986
math.tanh(-2) true -0.964
math.tanh(0) true <zero>
math.tanh(2) true 0.9640
math.tanh(2.5) true 0.9866
math.tanh('-2.5') true -0.986
math.tanh('-2') true -0.964
math.tanh('0') true <zero>
math.tanh('2') true 0.9640
math.tanh('2.5') true 0.9866
---------- math.fmod ----------
math.fmod(2,0) true <nan>
math.fmod(-2.5,0) true <nan>
math.fmod(2,1) true <zero>
math.fmod(5,2) true 1
math.fmod(-5,2) true -1
math.fmod(16,2) true <zero>
math.fmod(-16,-2) true <zero>
math.fmod(0.5,0) true <nan>
math.fmod(0.5,1) true 0.5
math.fmod(0.5,2) true 0.5
math.fmod(0.5,-1) true 0.5
math.fmod(0.5,2) true 0.5
math.fmod(2.25,0) true <nan>
math.fmod(2.25,2) true 0.25
math.fmod(-2,0) true <nan>
math.fmod(3,3) true <zero>
math.fmod('2','0') true <nan>
math.fmod('2.5','3') true 2.5
math.fmod('-2','1.5') true -0.5
math.fmod('-2.5','-1.5') true -1
math.fmod('3.0','3.0') true <zero>
math.fmod(2.75,2.75) true <zero>
math.fmod('2.75','2.75') true <zero>
math.fmod(3,'3') true <zero>
math.fmod('3',3) true <zero>
math.fmod(2.75,'2.75') true <zero>
math.fmod('2.75',2.75) true <zero>
math.fmod(-3,'-4') true -3
math.fmod('-3',4) true -3
math.fmod(-3,'4') true -3
math.fmod('-3',-4) true -3
math.fmod(-4.75,'2.75') true -2
math.fmod('-2.75',1.75) true -1
math.fmod(4.75,'-2.75') true 2
math.fmod('2.75',-1.75) true 1
---------- math.ldexp ----------
math.ldexp(2,0) true 2
math.ldexp(-2.5,0) true -2.5
math.ldexp(2,1) true 4
math.ldexp(5,2) true 20
math.ldexp(-5,2) true -20
math.ldexp(16,2) true 64
math.ldexp(-16,-2) true -4
math.ldexp(0.5,0) true 0.5
math.ldexp(0.5,1) true 1
math.ldexp(0.5,2) true 2
math.ldexp(0.5,-1) true 0.25
math.ldexp(0.5,2) true 2
math.ldexp(2.25,0) true 2.25
math.ldexp(2.25,2) true 9
math.ldexp(-2,0) true -2
math.ldexp(3,3) true 24
math.ldexp('2','0') true 2
math.ldexp('2.5','3') true 20
math.ldexp('-2','1.5') true -4
math.ldexp('-2.5','-1.5') true -1.25
math.ldexp('3.0','3.0') true 24
math.ldexp(2.75,2.75) true 11
math.ldexp('2.75','2.75') true 11
math.ldexp(3,'3') true 24
math.ldexp('3',3) true 24
math.ldexp(2.75,'2.75') true 11
math.ldexp('2.75',2.75) true 11
math.ldexp(-3,'-4') true -0.187
math.ldexp('-3',4) true -48
math.ldexp(-3,'4') true -48
math.ldexp('-3',-4) true -0.187
math.ldexp(-4.75,'2.75') true -19
math.ldexp('-2.75',1.75) true -5.5
math.ldexp(4.75,'-2.75') true 1.1875
math.ldexp('2.75',-1.75) true 1.375
---------- math.pow ----------
math.pow(2,0) true 1
math.pow(-2.5,0) true 1
math.pow(2,1) true 2
math.pow(5,2) true 25
math.pow(-5,2) true 25
math.pow(16,2) true 256
math.pow(-16,-2) true 0.0039
math.pow(0.5,0) true 1
math.pow(0.5,1) true 0.5
math.pow(0.5,2) true 0.25
math.pow(0.5,-1) true 2
math.pow(0.5,2) true 0.25
math.pow(2.25,0) true 1
math.pow(2.25,2) true 5.0625
math.pow(-2,0) true 1
math.pow(3,3) true 27
math.pow('2','0') true 1
math.pow('2.5','3') true 15.625
math.pow('-2','1.5') true <nan>
math.pow('-2.5','-1.5') true <nan>
math.pow('3.0','3.0') true 27
math.pow(2.75,2.75) true 16.149
math.pow('2.75','2.75') true 16.149
math.pow(3,'3') true 27
math.pow('3',3) true 27
math.pow(2.75,'2.75') true 16.149
math.pow('2.75',2.75) true 16.149
math.pow(-3,'-4') true 0.0123
math.pow('-3',4) true 81
math.pow(-3,'4') true 81
math.pow('-3',-4) true 0.0123
math.pow(-4.75,'2.75') true <nan>
math.pow('-2.75',1.75) true <nan>
math.pow(4.75,'-2.75') true 0.0137
math.pow('2.75',-1.75) true 0.1702
---------- math.atan2 (jse only) ----------
math.atan2(2,0) true 1.5707
math.atan2(-2.5,0) true -1.570
math.atan2(2,1) true 1.1071
math.atan2(5,2) true 1.1902
math.atan2(-5,2) true -1.190
math.atan2(16,2) true 1.4464
math.atan2(-16,-2) true -1.695
math.atan2(0.5,0) true 1.5707
math.atan2(0.5,1) true 0.4636
math.atan2(0.5,2) true 0.2449
math.atan2(0.5,-1) true 2.6779
math.atan2(0.5,2) true 0.2449
math.atan2(2.25,0) true 1.5707
math.atan2(2.25,2) true 0.8441
math.atan2(-2,0) true -1.570
math.atan2(3,3) true 0.7853
math.atan2('2','0') true 1.5707
math.atan2('2.5','3') true 0.6947
math.atan2('-2','1.5') true -0.927
math.atan2('-2.5','-1.5') true -2.111
math.atan2('3.0','3.0') true 0.7853
math.atan2(2.75,2.75) true 0.7853
math.atan2('2.75','2.75') true 0.7853
math.atan2(3,'3') true 0.7853
math.atan2('3',3) true 0.7853
math.atan2(2.75,'2.75') true 0.7853
math.atan2('2.75',2.75) true 0.7853
math.atan2(-3,'-4') true -2.498
math.atan2('-3',4) true -0.643
math.atan2(-3,'4') true -0.643
math.atan2('-3',-4) true -2.498
math.atan2(-4.75,'2.75') true -1.046
math.atan2('-2.75',1.75) true -1.004
math.atan2(4.75,'-2.75') true 2.0955
math.atan2('2.75',-1.75) true 2.1375
---------- math.max ----------
math.max(4) true 4
math.max(-4.5) true -4.5
math.max('5.5') true 5.5
math.max('-5') true -5
math.max(4,'8') true 8
math.max(-4.5,'-8') true -4.5
math.max('5.5',2.2) true 5.5
math.max('-5',-2.2) true -2.2
math.max(111,222,333) true 333
math.max(-222,-333,-111) true -111
math.max(444,-111,-222) true 444
---------- math.min ----------
math.min(4) true 4
math.min(-4.5) true -4.5
math.min('5.5') true 5.5
math.min('-5') true -5
math.min(4,'8') true 4
math.min(-4.5,'-8') true -8
math.min('5.5',2.2) true 2.2
math.min('-5',-2.2) true -5
math.min(111,222,333) true 111
math.min(-222,-333,-111) true -333
math.min(444,-111,-222) true -222
----------- Random number tests
math.random() number true
math.random() number true
math.random() number true
math.random() number true
math.random() number true
math.random(5,10) number true
math.random(5,10) number true
math.random(5,10) number true
math.random(5,10) number true
math.random(5,10) number true
math.random(30) number true
math.random(30) number true
math.random(30) number true
math.random(30) number true
math.random(30) number true
math.random(-4,-2) number true
math.random(-4,-2) number true
math.random(-4,-2) number true
math.random(-4,-2) number true
math.random(-4,-2) number true
-- comparing new numbers
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
false false
-- resetting seed
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
----------- Tests involving -0 and NaN
0 == -0 true
t[-0] == t[0] true
mz, z <zero> <zero>
mz == z true
a[z] == 1 and a[mz] == 1 true

View File

@@ -0,0 +1,649 @@
---- __eq same types
nil nil before true true
nil nil before true false
nil
nil
nil nil after true true
nil nil after true false
nil
nil
boolean boolean before true false
boolean boolean before true true
true
false
boolean boolean after true false
boolean boolean after true true
true
false
number number before true false
number number before true true
123
456
number number after true false
number number after true true
123
456
number number before true false
number number before true true
11
5.5
number number after true false
number number after true true
11
5.5
function function before true false
function function before true true
function.1
function.2
function function after true false
function function after true true
function.1
function.2
thread nil before true false
thread nil before true true
thread.3
nil
thread nil after true false
thread nil after true true
thread.3
nil
string string before true false
string string before true true
abc
def
string string after true false
string string after true true
abc
def
number string before true false
number string before true true
111
111
number string after true false
number string after true true
111
111
---- __eq, tables - should invoke metatag comparison
table table before true false
table table before true true
table.4
table.5
mt.__eq() table.4 table.5
table table after-a true true
mt.__eq() table.4 table.5
table table after-a true false
table.4
table.5
nilmt nil
boolmt nil
number nil
function nil
thread nil
---- __call
number before false attempt to call
111
mt.__call() 111 nil
number after true __call-result
mt.__call() 111 a
number after true __call-result
mt.__call() 111 a
number after true __call-result
mt.__call() 111 a
number after true __call-result
mt.__call() 111 a
number after true __call-result
111
boolean before false attempt to call
false
mt.__call() false nil
boolean after true __call-result
mt.__call() false a
boolean after true __call-result
mt.__call() false a
boolean after true __call-result
mt.__call() false a
boolean after true __call-result
mt.__call() false a
boolean after true __call-result
false
function before true nil
function.1
function after true
function after true
function after true
function after true
function after true
function.1
thread before false attempt to call
thread.3
mt.__call() thread.3 nil
thread after true __call-result
mt.__call() thread.3 a
thread after true __call-result
mt.__call() thread.3 a
thread after true __call-result
mt.__call() thread.3 a
thread after true __call-result
mt.__call() thread.3 a
thread after true __call-result
thread.3
table before false attempt to call
table.4
mt.__call() table.4 nil
table after true __call-result
mt.__call() table.4 a
table after true __call-result
mt.__call() table.4 a
table after true __call-result
mt.__call() table.4 a
table after true __call-result
mt.__call() table.4 a
table after true __call-result
table.4
---- __add, __sub, __mul, __div, __pow, __mod
boolean boolean before false attempt to perform arithmetic
boolean boolean before false attempt to perform arithmetic
boolean boolean before false attempt to perform arithmetic
boolean boolean before false attempt to perform arithmetic
boolean boolean before false attempt to perform arithmetic
boolean boolean before false attempt to perform arithmetic
boolean boolean before false attempt to perform arithmetic
boolean boolean before false attempt to perform arithmetic
boolean boolean before false attempt to perform arithmetic
boolean boolean before false attempt to perform arithmetic
false
mt.__add() false false
boolean boolean after true __add-result
mt.__add() false false
boolean boolean after true __add-result
mt.__sub() false false
boolean boolean after true __sub-result
mt.__sub() false false
boolean boolean after true __sub-result
mt.__mul() false false
boolean boolean after true __mul-result
mt.__mul() false false
boolean boolean after true __mul-result
mt.__pow() false false
boolean boolean after true __pow-result
mt.__pow() false false
boolean boolean after true __pow-result
mt.__mod() false false
boolean boolean after true __mod-result
mt.__mod() false false
boolean boolean after true __mod-result
false
false
boolean thread before false attempt to perform arithmetic
boolean thread before false attempt to perform arithmetic
boolean thread before false attempt to perform arithmetic
boolean thread before false attempt to perform arithmetic
boolean thread before false attempt to perform arithmetic
boolean thread before false attempt to perform arithmetic
boolean thread before false attempt to perform arithmetic
boolean thread before false attempt to perform arithmetic
boolean thread before false attempt to perform arithmetic
boolean thread before false attempt to perform arithmetic
false
mt.__add() false thread.3
boolean thread after true __add-result
mt.__add() thread.3 false
boolean thread after true __add-result
mt.__sub() false thread.3
boolean thread after true __sub-result
mt.__sub() thread.3 false
boolean thread after true __sub-result
mt.__mul() false thread.3
boolean thread after true __mul-result
mt.__mul() thread.3 false
boolean thread after true __mul-result
mt.__pow() false thread.3
boolean thread after true __pow-result
mt.__pow() thread.3 false
boolean thread after true __pow-result
mt.__mod() false thread.3
boolean thread after true __mod-result
mt.__mod() thread.3 false
boolean thread after true __mod-result
false
thread.3
boolean function before false attempt to perform arithmetic
boolean function before false attempt to perform arithmetic
boolean function before false attempt to perform arithmetic
boolean function before false attempt to perform arithmetic
boolean function before false attempt to perform arithmetic
boolean function before false attempt to perform arithmetic
boolean function before false attempt to perform arithmetic
boolean function before false attempt to perform arithmetic
boolean function before false attempt to perform arithmetic
boolean function before false attempt to perform arithmetic
false
mt.__add() false function.1
boolean function after true __add-result
mt.__add() function.1 false
boolean function after true __add-result
mt.__sub() false function.1
boolean function after true __sub-result
mt.__sub() function.1 false
boolean function after true __sub-result
mt.__mul() false function.1
boolean function after true __mul-result
mt.__mul() function.1 false
boolean function after true __mul-result
mt.__pow() false function.1
boolean function after true __pow-result
mt.__pow() function.1 false
boolean function after true __pow-result
mt.__mod() false function.1
boolean function after true __mod-result
mt.__mod() function.1 false
boolean function after true __mod-result
false
function.1
boolean string before false attempt to perform arithmetic
boolean string before false attempt to perform arithmetic
boolean string before false attempt to perform arithmetic
boolean string before false attempt to perform arithmetic
boolean string before false attempt to perform arithmetic
boolean string before false attempt to perform arithmetic
boolean string before false attempt to perform arithmetic
boolean string before false attempt to perform arithmetic
boolean string before false attempt to perform arithmetic
boolean string before false attempt to perform arithmetic
false
mt.__add() false abc
boolean string after true __add-result
mt.__add() abc false
boolean string after true __add-result
mt.__sub() false abc
boolean string after true __sub-result
mt.__sub() abc false
boolean string after true __sub-result
mt.__mul() false abc
boolean string after true __mul-result
mt.__mul() abc false
boolean string after true __mul-result
mt.__pow() false abc
boolean string after true __pow-result
mt.__pow() abc false
boolean string after true __pow-result
mt.__mod() false abc
boolean string after true __mod-result
mt.__mod() abc false
boolean string after true __mod-result
false
abc
boolean table before false attempt to perform arithmetic
boolean table before false attempt to perform arithmetic
boolean table before false attempt to perform arithmetic
boolean table before false attempt to perform arithmetic
boolean table before false attempt to perform arithmetic
boolean table before false attempt to perform arithmetic
boolean table before false attempt to perform arithmetic
boolean table before false attempt to perform arithmetic
boolean table before false attempt to perform arithmetic
boolean table before false attempt to perform arithmetic
false
mt.__add() false table.4
boolean table after true __add-result
mt.__add() table.4 false
boolean table after true __add-result
mt.__sub() false table.4
boolean table after true __sub-result
mt.__sub() table.4 false
boolean table after true __sub-result
mt.__mul() false table.4
boolean table after true __mul-result
mt.__mul() table.4 false
boolean table after true __mul-result
mt.__pow() false table.4
boolean table after true __pow-result
mt.__pow() table.4 false
boolean table after true __pow-result
mt.__mod() false table.4
boolean table after true __mod-result
mt.__mod() table.4 false
boolean table after true __mod-result
false
table.4
---- __len
boolean before false attempt to get length of
false
mt.__len() false
boolean after true __len-result
false
function before false attempt to get length of
function.1
mt.__len() function.1
function after true __len-result
function.1
thread before false attempt to get length of
thread.3
mt.__len() thread.3
thread after true __len-result
thread.3
number before false attempt to get length of
111
mt.__len() 111
number after true __len-result
111
---- __neg
nil before false attempt to perform arithmetic
false
mt.__unm() false
nil after true __unm-result
false
nil before false attempt to perform arithmetic
function.1
mt.__unm() function.1
nil after true __unm-result
function.1
nil before false attempt to perform arithmetic
thread.3
mt.__unm() thread.3
nil after true __unm-result
thread.3
nil before false attempt to perform arithmetic
abcd
mt.__unm() abcd
nil after true __unm-result
abcd
nil before false attempt to perform arithmetic
table.4
mt.__unm() table.4
nil after true __unm-result
table.4
nil before true -111
111
nil after true -111
111
---- __lt, __le, same types
boolean boolean before false attempt to compare
boolean boolean before false attempt to compare
boolean boolean before false attempt to compare
boolean boolean before false attempt to compare
true
true
mt.__lt() true true
boolean boolean after true true
mt.__le() true true
boolean boolean after true true
mt.__lt() true true
boolean boolean after true true
mt.__le() true true
boolean boolean after true true
true
true
boolean boolean before false attempt to compare
boolean boolean before false attempt to compare
boolean boolean before false attempt to compare
boolean boolean before false attempt to compare
true
false
mt.__lt() true false
boolean boolean after true true
mt.__le() true false
boolean boolean after true true
mt.__lt() false true
boolean boolean after true true
mt.__le() false true
boolean boolean after true true
true
false
function function before false attempt to compare
function function before false attempt to compare
function function before false attempt to compare
function function before false attempt to compare
function.1
function.6
mt.__lt() function.1 function.6
function function after true true
mt.__le() function.1 function.6
function function after true true
mt.__lt() function.6 function.1
function function after true true
mt.__le() function.6 function.1
function function after true true
function.1
function.6
thread thread before false attempt to compare
thread thread before false attempt to compare
thread thread before false attempt to compare
thread thread before false attempt to compare
thread.3
thread.7
mt.__lt() thread.3 thread.7
thread thread after true true
mt.__le() thread.3 thread.7
thread thread after true true
mt.__lt() thread.7 thread.3
thread thread after true true
mt.__le() thread.7 thread.3
thread thread after true true
thread.3
thread.7
table table before false attempt to compare
table table before false attempt to compare
table table before false attempt to compare
table table before false attempt to compare
table.4
table.4
mt.__lt() table.4 table.4
table table after true true
mt.__le() table.4 table.4
table table after true true
mt.__lt() table.4 table.4
table table after true true
mt.__le() table.4 table.4
table table after true true
table.4
table.4
table table before false attempt to compare
table table before false attempt to compare
table table before false attempt to compare
table table before false attempt to compare
table.4
table.8
mt.__lt() table.4 table.8
table table after true true
mt.__le() table.4 table.8
table table after true true
mt.__lt() table.8 table.4
table table after true true
mt.__le() table.8 table.4
table table after true true
table.4
table.8
---- __lt, __le, different types
boolean thread before false attempt to compare
boolean thread before false attempt to compare
boolean thread before false attempt to compare
boolean thread before false attempt to compare
false
thread.3
mt.__lt() false thread.3
boolean thread after-a true true
mt.__le() false thread.3
boolean thread after-a true true
mt.__lt() thread.3 false
boolean thread after-a true true
mt.__le() thread.3 false
boolean thread after-a true true
false
thread.3
---- __tostring
mt.__tostring(boolean)
boolean after mt.__tostring(boolean) mt.__tostring(boolean)
false
function.1
function after true mt.__tostring(function)
function.1
thread.3
thread after true mt.__tostring(thread)
thread.3
table.4
table after true mt.__tostring(table)
table.4
mt.__tostring(string)
mt.__tostring(string) mt.__tostring(string) true mt.__tostring(string)
abc
---- __index, __newindex
boolean before false attempt to index
boolean before false attempt to index
boolean before false index
boolean before false index
boolean before false attempt to index
false
mt.__index() false foo
boolean after true __index-result
mt.__index() false 123
boolean after true __index-result
mt.__newindex() false foo bar
boolean after true
mt.__newindex() false 123 bar
boolean after true
mt.__index() false foo
boolean after false attempt to call
false
number before false attempt to index
number before false attempt to index
number before false index
number before false index
number before false attempt to index
111
mt.__index() 111 foo
number after true __index-result
mt.__index() 111 123
number after true __index-result
mt.__newindex() 111 foo bar
number after true
mt.__newindex() 111 123 bar
number after true
mt.__index() 111 foo
number after false attempt to call
111
function before false attempt to index
function before false attempt to index
function before false index
function before false index
function before false attempt to index
function.1
mt.__index() function.1 foo
function after true __index-result
mt.__index() function.1 123
function after true __index-result
mt.__newindex() function.1 foo bar
function after true
mt.__newindex() function.1 123 bar
function after true
mt.__index() function.1 foo
function after false attempt to call
function.1
thread before false attempt to index
thread before false attempt to index
thread before false index
thread before false index
thread before false attempt to index
thread.3
mt.__index() thread.3 foo
thread after true __index-result
mt.__index() thread.3 123
thread after true __index-result
mt.__newindex() thread.3 foo bar
thread after true
mt.__newindex() thread.3 123 bar
thread after true
mt.__index() thread.3 foo
thread after false attempt to call
thread.3
---- __concat
table function before false attempt to concatenate
table function before false attempt to concatenate
table string number before false attempt to concatenate
string table number before false attempt to concatenate
string number table before false attempt to concatenate
table.4
mt.__concat(table,function) table.4 function.1
table function after true table.9
mt.__concat(function,table) function.1 table.4
table function after true table.9
mt.__concat(table,string) table.4 sss777
table string number before true table.9
mt.__concat(table,number) table.4 777
string table number before false attempt to concatenate
mt.__concat(number,table) 777 table.4
string number table before false attempt to concatenate
table.4
function.1
function table before false attempt to concatenate
function table before false attempt to concatenate
function string number before false attempt to concatenate
string function number before false attempt to concatenate
string number function before false attempt to concatenate
function.1
mt.__concat(function,table) function.1 table.4
function table after true table.9
mt.__concat(table,function) table.4 function.1
function table after true table.9
mt.__concat(function,string) function.1 sss777
function string number before true table.9
mt.__concat(function,number) function.1 777
string function number before false attempt to concatenate
mt.__concat(number,function) 777 function.1
string number function before false attempt to concatenate
function.1
table.4
number nil before false attempt to concatenate
number nil before false attempt to concatenate
number string number before true 123sss777
string number number before true sss123777
string number number before true sss777123
123
mt.__concat(number,nil) 123 nil
number nil after true table.9
mt.__concat(nil,number) nil 123
number nil after true table.9
number string number before true 123sss777
string number number before true sss123777
string number number before true sss777123
123
nil
nil number before false attempt to concatenate
nil number before false attempt to concatenate
nil string number before false attempt to concatenate
string nil number before false attempt to concatenate
string number nil before false attempt to concatenate
nil
mt.__concat(nil,number) nil 123
nil number after true table.9
mt.__concat(number,nil) 123 nil
nil number after true table.9
mt.__concat(nil,string) nil sss777
nil string number before true table.9
mt.__concat(nil,number) nil 777
string nil number before false attempt to concatenate
mt.__concat(number,nil) 777 nil
string number nil before false attempt to concatenate
nil
123
---- __metatable
boolean before true nil nil
false
boolean after true table.10 table.11
false
function before true nil nil
function.1
function after true table.10 table.11
function.1
thread before true nil nil
thread.3
thread after true table.10 table.11
thread.3
table before true nil nil
table.4
table after true table.10 table.11
table.4
string before true table.12 table.12
abc
string after true table.10 table.11
abc

View File

@@ -0,0 +1,49 @@
os table
os.clock() true number nil
os.date() true string nil
os.difftime(123000, 21500) true number nil
os.getenv() false string nil
os.getenv("bogus.key") true nil nil
os.tmpname() true string
os.tmpname() true string
io.open true userdata
write false string nil
close false string nil
os.rename(p,q) true boolean nil
os.remove(q) true boolean nil
os.remove(q) true nil string
os.setlocale("C") true string nil
os.exit function
os.date('%a', 1281364496) true string nil
os.date('%A', 1281364496) true string nil
os.date('%b', 1281364496) true string nil
os.date('%B', 1281364496) true string nil
os.date('%c', 1281364496) true string nil
os.date('%d', 1281364496) true string nil
os.date('%H', 1281364496) true string nil
os.date('%I', 1281364496) true string nil
os.date('%j', 1281364496) true string nil
os.date('%m', 1281364496) true string nil
os.date('%M', 1281364496) true string nil
os.date('%p', 1281364496) true string nil
os.date('%S', 1281364496) true string nil
os.date('%U', 1281364496) true string nil
os.date('%w', 1281364496) true string nil
os.date('%W', 1281364496) true string nil
os.date('%x', 1281364496) true string nil
os.date('%X', 1281364496) true string nil
os.date('%y', 1281364496) true string nil
os.date('%Y', 1281364496) true string nil
os.date('%z', 1281364496) true string nil
k string year v number 2010
k string month v number 8
k string day v number 9
k string hour v number 7
k string min v number 34
k string sec v number 56
k string wday v number 2
k string yday v number 221
k string isdst v boolean true
type(os.time()) number
os.time({year=1971, month=2, day=25}) 36360000
os.time({year=1971, month=2, day=25, hour=11, min=22, sec=33}) 36357753

View File

@@ -0,0 +1,245 @@
2
7
-- concat tests
onetwothree
one--two--three
two,three
two
onetwothreefourfive
one--two--three--four--five
two,three,four,five
two
-- insert, len tests
{[1]=one,[2]=two,[3]=three,[a]=aaa,[b]=bbb,[c]=ccc} 3
{[1]=one,[2]=two,[3]=three,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4
{[1]=seven,[2]=one,[3]=two,[4]=three,[5]=six,[a]=aaa,[b]=bbb,[c]=ccc} 5
{[1]=seven,[2]=one,[3]=two,[4]=eight,[5]=three,[6]=six,[a]=aaa,[b]=bbb,[c]=ccc} 6
{[1]=seven,[2]=one,[3]=two,[4]=eight,[5]=three,[6]=six,[7]=nine,[a]=aaa,[b]=bbb,[c]=ccc} 7
{[10]=ten,[1]=seven,[2]=one,[3]=two,[4]=eight,[5]=three,[6]=six,[7]=nine,[a]=aaa,[b]=bbb,[c]=ccc} 7
#{} 0
#{"a"} 1
#{"a","b"} 2
#{"a",nil} 1
#{nil,nil} 0
#{nil,"b"} true
#{"a","b","c"} 3
#{"a","b",nil} 2
#{"a",nil,nil} 1
#{nil,nil,nil} 0
#{nil,nil,"c"} true
#{nil,"b","c"} true
#{nil,"b",nil} true
#{"a",nil,"c"} true
-- remove tests
{[10]=ten,[1]=one,[2]=two,[3]=three,[4]=four,[5]=five,[6]=six,[7]=seven,[a]=aaa,[b]=bbb,[c]=ccc} 7
table.remove(t) seven
{[10]=ten,[1]=one,[2]=two,[3]=three,[4]=four,[5]=five,[6]=six,[a]=aaa,[b]=bbb,[c]=ccc} 6
table.remove(t,1) one
{[10]=ten,[1]=two,[2]=three,[3]=four,[4]=five,[5]=six,[a]=aaa,[b]=bbb,[c]=ccc} 5
table.remove(t,3) four
{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4
table.remove(t,5)
{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4
table.remove(t,10)
{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4
table.remove(t,-1)
{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4
table.remove(t,-1)
{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4
-- sort tests
one-two-three
one-three-two
www-vvv-uuu-ttt-sss-zzz-yyy-xxx
sss-ttt-uuu-vvv-www-xxx-yyy-zzz
www-vvv-uuu-ttt-sss-zzz-yyy-xxx
zzz-yyy-xxx-www-vvv-uuu-ttt-sss
----- unpack tests -------
pcall(unpack) false
pcall(unpack,nil) false
pcall(unpack,"abc") false
pcall(unpack,1) false
unpack({"aa"}) aa
unpack({"aa","bb"}) aa bb
unpack({"aa","bb","cc"}) aa bb cc
unpack -
unpack a a
unpack . nil
unpack ab a b
unpack .b nil b
unpack a. a nil
unpack abc a b c
unpack .ab nil a b
unpack a.b a nil b
unpack ab. a b nil
unpack ..b nil nil b
unpack a.. a nil nil
unpack .b. nil b nil
unpack ... nil nil nil
unpack (-)
unpack (a) a
unpack (.) nil
unpack (ab) a b
unpack (.b) nil b
unpack (a.) a nil
unpack (abc) a b c
unpack (.ab) nil a b
unpack (a.b) a nil b
unpack (ab.) a b nil
unpack (..b) nil nil b
unpack (a..) a nil nil
unpack (.b.) nil b nil
unpack (...) nil nil nil
pcall(unpack,t) true aa bb cc dd ee ff
pcall(unpack,t,2) true bb cc dd ee ff
pcall(unpack,t,2,5) true bb cc dd ee
pcall(unpack,t,2,6) true bb cc dd ee ff
pcall(unpack,t,2,7) true bb cc dd ee ff nil
pcall(unpack,t,1) true aa bb cc dd ee ff
pcall(unpack,t,1,5) true aa bb cc dd ee
pcall(unpack,t,1,6) true aa bb cc dd ee ff
pcall(unpack,t,1,7) true aa bb cc dd ee ff nil
pcall(unpack,t,0) true nil aa bb cc dd ee ff
pcall(unpack,t,0,5) true nil aa bb cc dd ee
pcall(unpack,t,0,6) true nil aa bb cc dd ee ff
pcall(unpack,t,0,7) true nil aa bb cc dd ee ff nil
pcall(unpack,t,-1) true nil nil aa bb cc dd ee ff
pcall(unpack,t,-1,5) true nil nil aa bb cc dd ee
pcall(unpack,t,-1,6) true nil nil aa bb cc dd ee ff
pcall(unpack,t,-1,7) true nil nil aa bb cc dd ee ff nil
pcall(unpack,t,2,4) true bb cc dd
pcall(unpack,t,2,5) true bb cc dd ee
pcall(unpack,t,2,6) true bb cc dd ee ff
pcall(unpack,t,2,7) true bb cc dd ee ff nil
pcall(unpack,t,2,8) true bb cc dd ee ff nil nil
pcall(unpack,t,2,2) true
pcall(unpack,t,2,1) true
pcall(unpack,t,2,0) true
pcall(unpack,t,2,-1) true
pcall(unpack,t,0) true zz aa bb cc dd ee ff
pcall(unpack,t,2,0) true
pcall(unpack,t,2,-1) true
pcall(unpack,t,"3") true cc dd ee ff
pcall(unpack,t,"a") false
pcall(unpack,t,function() end) false
----- misc table initializer tests -------
3
4
4
----- basic table operations -------
------ basic table tests on basic table table
t[1]=2 true
t[1] true 2
t[1]=nil true
t[1] true nil
t["a"]="b" true
t["a"],t.a true b b
t.a="c" true
t["a"],t.a true c c
t.a=nil true
t["a"],t.a true nil nil
t[nil]="d" false string
t[nil] true nil
t[nil]=nil false string
t[nil] true nil
------ basic table tests on function metatable on __index table
t[1]=2 true
t[1] true 2
t[1]=nil true
metatable call args table 1
t[1] true dummy
t["a"]="b" true
t["a"],t.a true b b
t.a="c" true
t["a"],t.a true c c
t.a=nil true
metatable call args table a
metatable call args table a
t["a"],t.a true dummy dummy
t[nil]="d" false string
metatable call args table nil
t[nil] true dummy
t[nil]=nil false string
metatable call args table nil
t[nil] true dummy
------ basic table tests on function metatable on __newindex table
metatable call args table 1 2
t[1]=2 true
t[1] true nil
metatable call args table 1 nil
t[1]=nil true
t[1] true nil
metatable call args table a b
t["a"]="b" true
t["a"],t.a true nil nil
metatable call args table a c
t.a="c" true
t["a"],t.a true nil nil
metatable call args table a nil
t.a=nil true
t["a"],t.a true nil nil
metatable call args table nil d
t[nil]="d" true nil
t[nil] true nil
metatable call args table nil nil
t[nil]=nil true nil
t[nil] true nil
------ basic table tests on plain metatable on __index table
t[1]=2 true
t[1] true 2
t[1]=nil true
t[1] true nil
t["a"]="b" true
t["a"],t.a true b b
t.a="c" true
t["a"],t.a true c c
t.a=nil true
t["a"],t.a true nil nil
t[nil]="d" false string
t[nil] true nil
t[nil]=nil false string
t[nil] true nil
------ basic table tests on plain metatable on __newindex table
t[1]=2 true
t[1] true 2
t[1]=nil true
t[1] true nil
t["a"]="b" true
t["a"],t.a true b b
t.a="c" true
t["a"],t.a true c c
t.a=nil true
t["a"],t.a true nil nil
t[nil]="d" false string
t[nil] true nil
t[nil]=nil false string
t[nil] true nil
-- sort tests
default (lexical) comparator
2-4-6-8-1-3-5-7
1-2-3-4-5-6-7-8
333-222-111
111-222-333
www-xxx-yyy-aaa-bbb-ccc
aaa-bbb-ccc-www-xxx-yyy
21-23-25-27-22-24-26-28
sort failed
custom (numerical) comparator
2-4-6-8-1-3-5-7
1-2-3-4-5-6-7-8
333-222-111
111-222-333
www-xxx-yyy-aaa-bbb-ccc
sort failed
21-23-25-27-22-24-26-28
21-22-23-24-25-26-27-28

View File

@@ -0,0 +1,211 @@
true true
b
true true
true true c
--f, n, table.unpack(t) func.1 0
true 0 0 0
--f, n, table.unpack(t) func.1 0 1
true 1 1 1
--f, n, table.unpack(t) func.1 0 1 2
true 1 3 3
--f, n, table.unpack(t) func.1 0 1 2 3
true 1 3 6
--f, n, table.unpack(t) func.1 0 1 2 3 4
true 1 3 6
--f, n, table.unpack(t) func.1 1
true 0 0 0
--f, n, table.unpack(t) func.1 1 1
true 1 2 3
--f, n, table.unpack(t) func.1 1 1 2
true 1 4 7
--f, n, table.unpack(t) func.1 1 1 2 3
true 1 4 10
--f, n, table.unpack(t) func.1 1 1 2 3 4
true 1 4 10
--f, n, table.unpack(t) func.1 2
true 0 0 0
--f, n, table.unpack(t) func.1 2 1
true 1 3 6
--f, n, table.unpack(t) func.1 2 1 2
true 1 5 12
--f, n, table.unpack(t) func.1 2 1 2 3
true 1 5 15
--f, n, table.unpack(t) func.1 2 1 2 3 4
true 1 5 15
--f, n, table.unpack(t) func.1 3
true 0 0 0
--f, n, table.unpack(t) func.1 3 1
true 1 4 10
--f, n, table.unpack(t) func.1 3 1 2
true 1 6 18
--f, n, table.unpack(t) func.1 3 1 2 3
true 1 6 21
--f, n, table.unpack(t) func.1 3 1 2 3 4
true 1 6 21
--f, n, table.unpack(t) func.2 0
--f2, n<=0, returning sum(...)
true 0
--f, n, table.unpack(t) func.2 0 1
--f2, n<=0, returning sum(...) 1
true 1
--f, n, table.unpack(t) func.2 0 1 2
--f2, n<=0, returning sum(...) 1 2
true 3
--f, n, table.unpack(t) func.2 0 1 2 3
--f2, n<=0, returning sum(...) 1 2 3
true 6
--f, n, table.unpack(t) func.2 0 1 2 3 4
--f2, n<=0, returning sum(...) 1 2 3 4
true 10
--f, n, table.unpack(t) func.2 1
--f2, n>0, returning f2(n-1,n,...) 0 1
--f2, n<=0, returning sum(...) 1
true 1
--f, n, table.unpack(t) func.2 1 1
--f2, n>0, returning f2(n-1,n,...) 0 1 1
--f2, n<=0, returning sum(...) 1 1
true 2
--f, n, table.unpack(t) func.2 1 1 2
--f2, n>0, returning f2(n-1,n,...) 0 1 1 2
--f2, n<=0, returning sum(...) 1 1 2
true 4
--f, n, table.unpack(t) func.2 1 1 2 3
--f2, n>0, returning f2(n-1,n,...) 0 1 1 2 3
--f2, n<=0, returning sum(...) 1 1 2 3
true 7
--f, n, table.unpack(t) func.2 1 1 2 3 4
--f2, n>0, returning f2(n-1,n,...) 0 1 1 2 3 4
--f2, n<=0, returning sum(...) 1 1 2 3 4
true 11
--f, n, table.unpack(t) func.2 2
--f2, n>0, returning f2(n-1,n,...) 1 2
--f2, n>0, returning f2(n-1,n,...) 0 1 2
--f2, n<=0, returning sum(...) 1 2
true 3
--f, n, table.unpack(t) func.2 2 1
--f2, n>0, returning f2(n-1,n,...) 1 2 1
--f2, n>0, returning f2(n-1,n,...) 0 1 2 1
--f2, n<=0, returning sum(...) 1 2 1
true 4
--f, n, table.unpack(t) func.2 2 1 2
--f2, n>0, returning f2(n-1,n,...) 1 2 1 2
--f2, n>0, returning f2(n-1,n,...) 0 1 2 1 2
--f2, n<=0, returning sum(...) 1 2 1 2
true 6
--f, n, table.unpack(t) func.2 2 1 2 3
--f2, n>0, returning f2(n-1,n,...) 1 2 1 2 3
--f2, n>0, returning f2(n-1,n,...) 0 1 2 1 2 3
--f2, n<=0, returning sum(...) 1 2 1 2 3
true 9
--f, n, table.unpack(t) func.2 2 1 2 3 4
--f2, n>0, returning f2(n-1,n,...) 1 2 1 2 3 4
--f2, n>0, returning f2(n-1,n,...) 0 1 2 1 2 3 4
--f2, n<=0, returning sum(...) 1 2 1 2 3 4
true 13
--f, n, table.unpack(t) func.2 3
--f2, n>0, returning f2(n-1,n,...) 2 3
--f2, n>0, returning f2(n-1,n,...) 1 2 3
--f2, n>0, returning f2(n-1,n,...) 0 1 2 3
--f2, n<=0, returning sum(...) 1 2 3
true 6
--f, n, table.unpack(t) func.2 3 1
--f2, n>0, returning f2(n-1,n,...) 2 3 1
--f2, n>0, returning f2(n-1,n,...) 1 2 3 1
--f2, n>0, returning f2(n-1,n,...) 0 1 2 3 1
--f2, n<=0, returning sum(...) 1 2 3 1
true 7
--f, n, table.unpack(t) func.2 3 1 2
--f2, n>0, returning f2(n-1,n,...) 2 3 1 2
--f2, n>0, returning f2(n-1,n,...) 1 2 3 1 2
--f2, n>0, returning f2(n-1,n,...) 0 1 2 3 1 2
--f2, n<=0, returning sum(...) 1 2 3 1 2
true 9
--f, n, table.unpack(t) func.2 3 1 2 3
--f2, n>0, returning f2(n-1,n,...) 2 3 1 2 3
--f2, n>0, returning f2(n-1,n,...) 1 2 3 1 2 3
--f2, n>0, returning f2(n-1,n,...) 0 1 2 3 1 2 3
--f2, n<=0, returning sum(...) 1 2 3 1 2 3
true 12
--f, n, table.unpack(t) func.2 3 1 2 3 4
--f2, n>0, returning f2(n-1,n,...) 2 3 1 2 3 4
--f2, n>0, returning f2(n-1,n,...) 1 2 3 1 2 3 4
--f2, n>0, returning f2(n-1,n,...) 0 1 2 3 1 2 3 4
--f2, n<=0, returning sum(...) 1 2 3 1 2 3 4
true 16
--f, n, table.unpack(t) func.3 0
true 0
--f, n, table.unpack(t) func.3 0 1
true 1
--f, n, table.unpack(t) func.3 0 1 2
true 3
--f, n, table.unpack(t) func.3 0 1 2 3
true 6
--f, n, table.unpack(t) func.3 0 1 2 3 4
true 10
--f, n, table.unpack(t) func.3 1
f3,n-1,n,... func.3 0 1
true true 1
--f, n, table.unpack(t) func.3 1 1
f3,n-1,n,... func.3 0 1 1
true true 2
--f, n, table.unpack(t) func.3 1 1 2
f3,n-1,n,... func.3 0 1 1 2
true true 4
--f, n, table.unpack(t) func.3 1 1 2 3
f3,n-1,n,... func.3 0 1 1 2 3
true true 7
--f, n, table.unpack(t) func.3 1 1 2 3 4
f3,n-1,n,... func.3 0 1 1 2 3 4
true true 11
--f, n, table.unpack(t) func.3 2
f3,n-1,n,... func.3 1 2
f3,n-1,n,... func.3 0 1 2
true true true 3
--f, n, table.unpack(t) func.3 2 1
f3,n-1,n,... func.3 1 2 1
f3,n-1,n,... func.3 0 1 2 1
true true true 4
--f, n, table.unpack(t) func.3 2 1 2
f3,n-1,n,... func.3 1 2 1 2
f3,n-1,n,... func.3 0 1 2 1 2
true true true 6
--f, n, table.unpack(t) func.3 2 1 2 3
f3,n-1,n,... func.3 1 2 1 2 3
f3,n-1,n,... func.3 0 1 2 1 2 3
true true true 9
--f, n, table.unpack(t) func.3 2 1 2 3 4
f3,n-1,n,... func.3 1 2 1 2 3 4
f3,n-1,n,... func.3 0 1 2 1 2 3 4
true true true 13
--f, n, table.unpack(t) func.3 3
f3,n-1,n,... func.3 2 3
f3,n-1,n,... func.3 1 2 3
f3,n-1,n,... func.3 0 1 2 3
true true true true 6
--f, n, table.unpack(t) func.3 3 1
f3,n-1,n,... func.3 2 3 1
f3,n-1,n,... func.3 1 2 3 1
f3,n-1,n,... func.3 0 1 2 3 1
true true true true 7
--f, n, table.unpack(t) func.3 3 1 2
f3,n-1,n,... func.3 2 3 1 2
f3,n-1,n,... func.3 1 2 3 1 2
f3,n-1,n,... func.3 0 1 2 3 1 2
true true true true 9
--f, n, table.unpack(t) func.3 3 1 2 3
f3,n-1,n,... func.3 2 3 1 2 3
f3,n-1,n,... func.3 1 2 3 1 2 3
f3,n-1,n,... func.3 0 1 2 3 1 2 3
true true true true 12
--f, n, table.unpack(t) func.3 3 1 2 3 4
f3,n-1,n,... func.3 2 3 1 2 3 4
f3,n-1,n,... func.3 1 2 3 1 2 3 4
f3,n-1,n,... func.3 0 1 2 3 1 2 3 4
true true true true 16
120
120
1234
true 832040
true 832040
true inf
1 1 2 3 5 8 13 21 34

View File

@@ -0,0 +1,23 @@
-------- simple upvalues tests --------
6
5
f1()= 6
g1()= 5
6
5
f2()= 6
g2()= 5
g1()= 4
f1()= 5
simplevalues result: true
----------- upvalued in middle ------------
x= 3
y= 5
z= 7
x= x
y= y
z= z
true
--------- nested upvalues ----------
10 20
nestedupvaluestest result: true

View File

@@ -0,0 +1,418 @@
-------- basic vm tests --------
-- boolean tests
true
false
false
true
true
false
false
true
true
false
false
true
false
true
1
0
nil
1
0
nil
booleantests result: true
------------- varargs
---- function p()
--p():
a nil
...
...,a nil nil
a,... nil
-> true
--p("q"):
a q
...
...,a nil q
a,... q
-> true
--p("q","r"):
a q
... r
...,a r q
a,... q r
-> true
--p("q","r","s"):
a q
... r s
...,a r q
a,... q r s
-> true
---- function q()
--q():
a,arg[1],arg[2],arg[3] nil nil global-1 global-2 global-3
-> true
--q("q"):
a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3
-> true
--q("q","r"):
a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3
-> true
--q("q","r","s"):
a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3
-> true
---- function r()
--r():
a,arg[1],arg[2],arg[3] nil nil global-1 global-2 global-3
a nil
...
...,a nil nil
a,... nil
-> true
--r("q"):
a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3
a q
...
...,a nil q
a,... q
-> true
--r("q","r"):
a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3
a q
... r
...,a r q
a,... q r
-> true
--r("q","r","s"):
a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3
a q
... r s
...,a r q
a,... q r s
-> true
---- function s()
--s():
a,arg[1],arg[2],arg[3] nil 1 2 3
a nil
-> true
--s("q"):
a,arg[1],arg[2],arg[3] q 1 2 3
a q
-> true
--s("q","r"):
a,arg[1],arg[2],arg[3] q 1 2 3
a q
-> true
--s("q","r","s"):
a,arg[1],arg[2],arg[3] q 1 2 3
a q
-> true
---- function t()
--t():
a,arg[1],arg[2],arg[3] nil 1 2 3
a nil
...
...,a nil nil
a,... nil
-> true
--t("q"):
a,arg[1],arg[2],arg[3] q 1 2 3
a q
...
...,a nil q
a,... q
-> true
--t("q","r"):
a,arg[1],arg[2],arg[3] q 1 2 3
a q
... r
...,a r q
a,... q r
-> true
--t("q","r","s"):
a,arg[1],arg[2],arg[3] q 1 2 3
a q
... r s
...,a r q
a,... q r s
-> true
---- function u()
--u():
arg nil
-> true
--u("q"):
arg q
-> true
--u("q","r"):
arg q
-> true
--u("q","r","s"):
arg q
-> true
---- function v()
--v():
arg nil
...
arg,... nil
-> true
--v("q"):
arg q
...
arg,... q
-> true
--v("q","r"):
arg q
... r
arg,... q r
-> true
--v("q","r","s"):
arg q
... r s
arg,... q r s
-> true
varargstest result: true
---------- metatable tests
ell
set{} tbl.1 tbl.2 tbl.1 nil
set-nil tbl.1 nil tbl.1 nil
set{} tbl.1 tbl.3 tbl.1 nil
set tbl.1 tbl.3 false string
set{} tbl.1 tbl.4 tbl.1 nil
set{} tbl.1 tbl.5 tbl.1 nil
set{}{} tbl.1 tbl.6 tbl.1 nil
set-nil tbl.1 nil tbl.1 nil
set{__} tbl.1 tbl.7 tbl.1 nil
set{} tbl.1 tbl.7 false string
set-nil tbl.1 tbl.7 false string
set{} tbl.8 tbl.9 tbl.8 nil
set-nil tbl.8 nil tbl.8 nil
set{__} tbl.8 abc tbl.8 nil
set{} tbl.8 abc false string
set-nil tbl.8 abc false string
t.a 1234
t.b 1235
t.a 1234
t.b 1235
t.c 1236
t.a 1234
t.b 1235
t.c 1236
t.d 1237
metatabletests result: true
------------ huge tables
#t= 100 t[1,50,51,59] 1 1 1 1
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
#t2= 70 t[1,50,51,59] 1 1 1 1
0,3,4,7,9,8,12,15,23,5,10,13,14,17,19,18,112,115,123,15,20,33,24,27,29,28,212,215,223,25,40,43,44,47,49,48,412,415,423,45,50,53,54,57,59,58,512,515,523,55,60,63,64,67,69,68,612,615,623,65,70,73,74,77,79,78,72,715,723,75
t[2000] a
t[2001] b
t[2002] c
t[2003] d
t[2004] e
t[2005] f
t[2006] g
t[2007] h
t[2008] i
t[2009] j
t[3000] a
t[3001] b
t[3002] c
t[3003] d
t[3004] e
t[3005] f
t[3006] g
t[3007] h
t[3008] i
t[3009] j
t[4000] a
t[4001] b
t[4002] c
t[4003] d
t[4004] e
t[4005] f
t[4006] g
t[4007] h
t[4008] i
t[4009] j
t[5000] a
t[5001] b
t[5002] c
t[5003] d
t[5004] e
t[5005] f
t[5006] g
t[5007] h
t[5008] i
t[5009] j
t[6000] a
t[6001] b
t[6002] c
t[6003] d
t[6004] e
t[6005] f
t[6006] g
t[6007] h
t[6008] i
t[6009] j
t[7000] a
t[7001] b
t[7002] c
t[7003] d
t[7004] e
t[7005] f
t[7006] g
t[7007] h
t[7008] i
t[7009] j
t[8000] a
t[8001] b
t[8002] c
t[8003] d
t[8004] e
t[8005] f
t[8006] g
t[8007] h
t[8008] i
t[8009] j
hugetables result: true
--------- many locals
a a
b b
c c
d d
e e
f f
g g
h h
i i
j j
a a
b b
c c
d d
e e
f f
g g
h h
i i
j j
a a
b b
c c
d d
e e
f f
g g
h h
i i
j j
a a
b b
c c
d d
e e
f f
g g
h h
i i
j j
a a
b b
c c
d d
e e
f f
g g
h h
i i
j j
a a
b b
c c
d d
e e
f f
g g
h h
i i
j j
a a
b b
c c
d d
e e
f f
g g
h h
i i
j j
a a
b b
c c
d d
e e
f f
g g
h h
i i
j j
a a
b b
c c
d d
e e
f f
g g
h h
i i
j j
a a
b b
c c
d d
e e
f f
g g
h h
i i
j j
a a
b b
c c
d d
e e
f f
g g
h h
i i
j j
a a
b b
c c
d d
e e
f f
g g
h h
i i
j j
a a
b b
c c
d d
e e
f f
g g
h h
i i
j j
a a
b b
c c
d d
e e
f f
g g
h h
i i
j j
manylocals result: true

View File

@@ -0,0 +1,530 @@
====== assert ======
--- checkallpass
- assert(true,nil) true
- assert(123,nil) 123
- assert(true,'abc') true,'abc'
- assert(123,'abc') 123,'abc'
- assert(true,1.25) true,1.25
- assert(123,1.25) 123,1.25
- assert(true,true) true,true
- assert(123,true) 123,true
- assert(true,<table>) true,<table>
- assert(123,<table>) 123,<table>
- assert(true,<function>) true,<function>
- assert(123,<function>) 123,<function>
- assert(true,<thread>) true,<thread>
- assert(123,<thread>) 123,<thread>
--- checkallerrors
- assert(nil,nil) ...assertion failed...
- assert(false,nil) ...assertion failed...
--- checkallerrors
- assert(nil,'message') ...message...
- assert(false,'message') ...message...
====== collectgarbage ======
--- checkallpass
- collectgarbage('collect') number
- collectgarbage('count') number,number
--- checkallerrors
- collectgarbage('abc') ...bad argument...
- collectgarbage(1.25) ...bad argument...
--- checkallerrors
- collectgarbage(true) ...string expected...
- collectgarbage(<table>) ...string expected...
- collectgarbage(<function>) ...string expected...
- collectgarbage(<thread>) ...string expected...
====== dofile ======
====== error ======
====== getmetatable ======
--- checkallpass
- getmetatable('abc') <table>
- getmetatable(1.25)
- getmetatable(true)
- getmetatable(<table>)
- getmetatable(<function>)
- getmetatable(<thread>)
--- checkallerrors
- getmetatable() ...bad argument...
====== ipairs ======
--- checkallpass
- ipairs(<table>) <function>,<table>,0
--- checkallerrors
- ipairs(nil) ...bad argument...
- ipairs('abc') ...bad argument...
- ipairs(1.25) ...bad argument...
- ipairs(true) ...bad argument...
- ipairs(<function>) ...bad argument...
- ipairs(<thread>) ...bad argument...
====== load ======
--- checkallpass
- load(<function>,nil) <function>
- load(<function>,'abc') <function>
--- checkallerrors
- load(nil,nil) ...bad argument...
needcheck load('abc',nil) nil
needcheck load(1.25,nil) nil
- load(true,nil) ...bad argument...
- load(<table>,nil) ...bad argument...
- load(<thread>,nil) ...bad argument...
- load(nil,'abc') ...bad argument...
needcheck load('abc','abc') nil
needcheck load(1.25,'abc') nil
- load(true,'abc') ...bad argument...
- load(<table>,'abc') ...bad argument...
- load(<thread>,'abc') ...bad argument...
- load(nil,1.25) ...bad argument...
needcheck load('abc',1.25) nil
needcheck load(1.25,1.25) nil
- load(true,1.25) ...bad argument...
- load(<table>,1.25) ...bad argument...
- load(<thread>,1.25) ...bad argument...
--- checkallerrors
- load(<function>,<function>) ...bad argument...
- load(<function>,<table>) ...bad argument...
====== loadfile ======
====== load ======
--- checkallpass
- load('return') <function>
--- checkallpass
- load('return','mychunk') <function>
--- checkallpass
- load('return a ... b','mychunk') nil,string
--- checkallerrors
- load(nil,nil) ...bad argument...
- load(true,nil) ...bad argument...
- load(<table>,nil) ...bad argument...
needcheck load(<function>,nil) function: 0x10011ba00
- load(<thread>,nil) ...bad argument...
- load(nil,'abc') ...bad argument...
- load(true,'abc') ...bad argument...
- load(<table>,'abc') ...bad argument...
needcheck load(<function>,'abc') function: 0x10011c780
- load(<thread>,'abc') ...bad argument...
- load(nil,1.25) ...bad argument...
- load(true,1.25) ...bad argument...
- load(<table>,1.25) ...bad argument...
needcheck load(<function>,1.25) function: 0x10011d560
- load(<thread>,1.25) ...bad argument...
--- checkallerrors
- load('return',<function>) ...bad argument...
- load('return',<table>) ...bad argument...
====== next ======
--- checkallpass
- next(<table>,'aa')
--- checkallerrors
- next(nil,nil) ...bad argument...
- next('abc',nil) ...bad argument...
- next(1.25,nil) ...bad argument...
- next(true,nil) ...bad argument...
- next(<function>,nil) ...bad argument...
- next(<thread>,nil) ...bad argument...
- next(nil,1) ...bad argument...
- next('abc',1) ...bad argument...
- next(1.25,1) ...bad argument...
- next(true,1) ...bad argument...
- next(<function>,1) ...bad argument...
- next(<thread>,1) ...bad argument...
--- checkallerrors
- next(<table>,'abc') ...invalid key...
- next(<table>,1.25) ...invalid key...
- next(<table>,true) ...invalid key...
- next(<table>,<table>) ...invalid key...
- next(<table>,<function>) ...invalid key...
====== pairs ======
--- checkallpass
- pairs(<table>) <function>,<table>
--- checkallerrors
- pairs(nil) ...bad argument...
- pairs('abc') ...bad argument...
- pairs(1.25) ...bad argument...
- pairs(true) ...bad argument...
- pairs(<function>) ...bad argument...
- pairs(<thread>) ...bad argument...
====== pcall ======
--- checkallpass
- pcall('abc',nil) boolean,string
- pcall(1.25,nil) boolean,string
- pcall(true,nil) boolean,string
- pcall(<table>,nil) boolean,string
- pcall(<function>,nil) boolean
- pcall(<thread>,nil) boolean,string
- pcall('abc','abc') boolean,string
- pcall(1.25,'abc') boolean,string
- pcall(true,'abc') boolean,string
- pcall(<table>,'abc') boolean,string
- pcall(<function>,'abc') boolean
- pcall(<thread>,'abc') boolean,string
- pcall('abc',1.25) boolean,string
- pcall(1.25,1.25) boolean,string
- pcall(true,1.25) boolean,string
- pcall(<table>,1.25) boolean,string
- pcall(<function>,1.25) boolean
- pcall(<thread>,1.25) boolean,string
- pcall('abc',true) boolean,string
- pcall(1.25,true) boolean,string
- pcall(true,true) boolean,string
- pcall(<table>,true) boolean,string
- pcall(<function>,true) boolean
- pcall(<thread>,true) boolean,string
- pcall('abc',<table>) boolean,string
- pcall(1.25,<table>) boolean,string
- pcall(true,<table>) boolean,string
- pcall(<table>,<table>) boolean,string
- pcall(<function>,<table>) boolean
- pcall(<thread>,<table>) boolean,string
- pcall('abc',<function>) boolean,string
- pcall(1.25,<function>) boolean,string
- pcall(true,<function>) boolean,string
- pcall(<table>,<function>) boolean,string
- pcall(<function>,<function>) boolean
- pcall(<thread>,<function>) boolean,string
- pcall('abc',<thread>) boolean,string
- pcall(1.25,<thread>) boolean,string
- pcall(true,<thread>) boolean,string
- pcall(<table>,<thread>) boolean,string
- pcall(<function>,<thread>) boolean
- pcall(<thread>,<thread>) boolean,string
--- checkallerrors
- pcall() ...bad argument...
====== print ======
--- checkallpass
- print()
--- checkallpass
nil
- print(nil)
abc
- print('abc')
1.25
- print(1.25)
true
- print(true)
====== rawequal ======
--- checkallpass
- rawequal('abc','abc') true
- rawequal(1.25,'abc') false
- rawequal(true,'abc') false
- rawequal(<table>,'abc') false
- rawequal(<function>,'abc') false
- rawequal(<thread>,'abc') false
- rawequal('abc',1.25) false
- rawequal(1.25,1.25) true
- rawequal(true,1.25) false
- rawequal(<table>,1.25) false
- rawequal(<function>,1.25) false
- rawequal(<thread>,1.25) false
- rawequal('abc',true) false
- rawequal(1.25,true) false
- rawequal(true,true) true
- rawequal(<table>,true) false
- rawequal(<function>,true) false
- rawequal(<thread>,true) false
- rawequal('abc',<table>) false
- rawequal(1.25,<table>) false
- rawequal(true,<table>) false
- rawequal(<table>,<table>) true
- rawequal(<function>,<table>) false
- rawequal(<thread>,<table>) false
- rawequal('abc',<function>) false
- rawequal(1.25,<function>) false
- rawequal(true,<function>) false
- rawequal(<table>,<function>) false
- rawequal(<function>,<function>) true
- rawequal(<thread>,<function>) false
- rawequal('abc',<thread>) false
- rawequal(1.25,<thread>) false
- rawequal(true,<thread>) false
- rawequal(<table>,<thread>) false
- rawequal(<function>,<thread>) false
- rawequal(<thread>,<thread>) true
--- checkallerrors
- rawequal() ...bad argument...
--- checkallerrors
- rawequal('abc') ...bad argument...
- rawequal(1.25) ...bad argument...
- rawequal(true) ...bad argument...
- rawequal(<table>) ...bad argument...
- rawequal(<function>) ...bad argument...
- rawequal(<thread>) ...bad argument...
====== rawget ======
--- checkallpass
- rawget(<table>,'aa') 456
--- checkallpass
- rawget(<table>,'abc')
- rawget(<table>,1.25)
- rawget(<table>,true)
- rawget(<table>,<table>)
- rawget(<table>,<function>)
--- checkallerrors
--- checkallerrors
- rawget(nil,'abc') ...bad argument...
- rawget('abc','abc') ...bad argument...
- rawget(1.25,'abc') ...bad argument...
- rawget(true,'abc') ...bad argument...
- rawget(<function>,'abc') ...bad argument...
- rawget(<thread>,'abc') ...bad argument...
- rawget(nil,1.25) ...bad argument...
- rawget('abc',1.25) ...bad argument...
- rawget(1.25,1.25) ...bad argument...
- rawget(true,1.25) ...bad argument...
- rawget(<function>,1.25) ...bad argument...
- rawget(<thread>,1.25) ...bad argument...
- rawget(nil,true) ...bad argument...
- rawget('abc',true) ...bad argument...
- rawget(1.25,true) ...bad argument...
- rawget(true,true) ...bad argument...
- rawget(<function>,true) ...bad argument...
- rawget(<thread>,true) ...bad argument...
- rawget(nil,<table>) ...bad argument...
- rawget('abc',<table>) ...bad argument...
- rawget(1.25,<table>) ...bad argument...
- rawget(true,<table>) ...bad argument...
- rawget(<function>,<table>) ...bad argument...
- rawget(<thread>,<table>) ...bad argument...
- rawget(nil,<function>) ...bad argument...
- rawget('abc',<function>) ...bad argument...
- rawget(1.25,<function>) ...bad argument...
- rawget(true,<function>) ...bad argument...
- rawget(<function>,<function>) ...bad argument...
- rawget(<thread>,<function>) ...bad argument...
--- checkallerrors
- rawget() ...bad argument...
====== rawset ======
--- checkallpass
- rawset(<table>,'aa','abc') <table>
- rawset(<table>,'aa',1.25) <table>
- rawset(<table>,'aa',true) <table>
- rawset(<table>,'aa',<table>) <table>
- rawset(<table>,'aa',<function>) <table>
- rawset(<table>,'aa',<thread>) <table>
--- checkallpass
- rawset(<table>,'abc','abc') <table>
- rawset(<table>,1.25,'abc') <table>
- rawset(<table>,true,'abc') <table>
- rawset(<table>,<table>,'abc') <table>
- rawset(<table>,<function>,'abc') <table>
- rawset(<table>,'abc',1.25) <table>
- rawset(<table>,1.25,1.25) <table>
- rawset(<table>,true,1.25) <table>
- rawset(<table>,<table>,1.25) <table>
- rawset(<table>,<function>,1.25) <table>
- rawset(<table>,'abc',true) <table>
- rawset(<table>,1.25,true) <table>
- rawset(<table>,true,true) <table>
- rawset(<table>,<table>,true) <table>
- rawset(<table>,<function>,true) <table>
- rawset(<table>,'abc',<table>) <table>
- rawset(<table>,1.25,<table>) <table>
- rawset(<table>,true,<table>) <table>
- rawset(<table>,<table>,<table>) <table>
- rawset(<table>,<function>,<table>) <table>
- rawset(<table>,'abc',<function>) <table>
- rawset(<table>,1.25,<function>) <table>
- rawset(<table>,true,<function>) <table>
- rawset(<table>,<table>,<function>) <table>
- rawset(<table>,<function>,<function>) <table>
- rawset(<table>,'abc',<thread>) <table>
- rawset(<table>,1.25,<thread>) <table>
- rawset(<table>,true,<thread>) <table>
- rawset(<table>,<table>,<thread>) <table>
- rawset(<table>,<function>,<thread>) <table>
--- checkallerrors
--- checkallerrors
- rawset() ...bad argument...
--- checkallerrors
- rawset(nil,'abc','abc') ...bad argument...
- rawset('abc','abc','abc') ...bad argument...
- rawset(1.25,'abc','abc') ...bad argument...
- rawset(true,'abc','abc') ...bad argument...
- rawset(<function>,'abc','abc') ...bad argument...
- rawset(<thread>,'abc','abc') ...bad argument...
- rawset(nil,1.25,'abc') ...bad argument...
- rawset('abc',1.25,'abc') ...bad argument...
- rawset(1.25,1.25,'abc') ...bad argument...
- rawset(true,1.25,'abc') ...bad argument...
- rawset(<function>,1.25,'abc') ...bad argument...
- rawset(<thread>,1.25,'abc') ...bad argument...
- rawset(nil,'abc',1.25) ...bad argument...
- rawset('abc','abc',1.25) ...bad argument...
- rawset(1.25,'abc',1.25) ...bad argument...
- rawset(true,'abc',1.25) ...bad argument...
- rawset(<function>,'abc',1.25) ...bad argument...
- rawset(<thread>,'abc',1.25) ...bad argument...
- rawset(nil,1.25,1.25) ...bad argument...
- rawset('abc',1.25,1.25) ...bad argument...
- rawset(1.25,1.25,1.25) ...bad argument...
- rawset(true,1.25,1.25) ...bad argument...
- rawset(<function>,1.25,1.25) ...bad argument...
- rawset(<thread>,1.25,1.25) ...bad argument...
--- checkallerrors
- rawset(<table>,'aa') ...bad argument...
====== select ======
--- checkallpass
- select(1.25,nil)
- select('#',nil) 1
- select(1.25,'abc') 'abc'
- select('#','abc') 1
- select(1.25,1.25) 1.25
- select('#',1.25) 1
- select(1.25,true) true
- select('#',true) 1
- select(1.25,<table>) <table>
- select('#',<table>) 1
- select(1.25,<function>) <function>
- select('#',<function>) 1
- select(1.25,<thread>) <thread>
- select('#',<thread>) 1
--- checkallerrors
- select(nil) ...bad argument...
- select('abc') ...bad argument...
- select(true) ...bad argument...
- select(<table>) ...bad argument...
- select(<function>) ...bad argument...
- select(<thread>) ...bad argument...
====== setmetatable ======
--- checkallpass
- setmetatable(<table>,<table>) <table>
--- checkallpass
--- checkallerrors
- setmetatable(nil,<table>) ...bad argument...
- setmetatable('abc',<table>) ...bad argument...
- setmetatable(1.25,<table>) ...bad argument...
- setmetatable(true,<table>) ...bad argument...
- setmetatable(<function>,<table>) ...bad argument...
- setmetatable(<thread>,<table>) ...bad argument...
--- checkallerrors
- setmetatable(<table>,'abc') ...bad argument...
- setmetatable(<table>,1.25) ...bad argument...
- setmetatable(<table>,true) ...bad argument...
- setmetatable(<table>,<function>) ...bad argument...
- setmetatable(<table>,<thread>) ...bad argument...
====== tonumber ======
--- checkallpass
- tonumber(1.25,nil) 1.25
- tonumber('789',nil) 789
- tonumber(1.25,2)
- tonumber('789',2)
- tonumber(1.25,10)
- tonumber('789',10) 789
- tonumber(1.25,36)
- tonumber('789',36) 9369
--- checkallpass
- tonumber('abc',nil)
- tonumber(1.25,nil) 1.25
- tonumber(true,nil)
- tonumber(<table>,nil)
- tonumber(<function>,nil)
- tonumber(<thread>,nil)
- tonumber('abc',10)
- tonumber(1.25,10)
fail tonumber(true,10) 'bad argument #1 to '_G.tonumber' (string expected, got boolean)'
fail tonumber(<table>,10) 'bad argument #1 to '_G.tonumber' (string expected, got table)'
fail tonumber(<function>,10) 'bad argument #1 to '_G.tonumber' (string expected, got function)'
fail tonumber(<thread>,10) 'bad argument #1 to '_G.tonumber' (string expected, got thread)'
--- checkallerrors
- tonumber(nil,2) ...bad argument...
- tonumber(<function>,2) ...bad argument...
- tonumber(<table>,2) ...bad argument...
- tonumber(nil,9) ...bad argument...
- tonumber(<function>,9) ...bad argument...
- tonumber(<table>,9) ...bad argument...
- tonumber(nil,11) ...bad argument...
- tonumber(<function>,11) ...bad argument...
- tonumber(<table>,11) ...bad argument...
- tonumber(nil,36) ...bad argument...
- tonumber(<function>,36) ...bad argument...
- tonumber(<table>,36) ...bad argument...
--- checkallerrors
- tonumber(1.25,1) ...bad argument...
- tonumber('789',1) ...bad argument...
- tonumber(1.25,37) ...bad argument...
- tonumber('789',37) ...bad argument...
- tonumber(1.25,<table>) ...bad argument...
- tonumber('789',<table>) ...bad argument...
- tonumber(1.25,<function>) ...bad argument...
- tonumber('789',<function>) ...bad argument...
- tonumber(1.25,true) ...bad argument...
- tonumber('789',true) ...bad argument...
====== tostring ======
--- checkallpass
- tostring('abc') 'abc'
- tostring(1.25) '1.25'
- tostring(true) 'true'
--- checkallpass
- tostring(<table>) string
- tostring(<function>) string
- tostring(<thread>) string
--- checkallpass
- tostring('abc','anchor') 'abc'
- tostring(1.25,'anchor') '1.25'
- tostring(true,'anchor') 'true'
--- checkallpass
- tostring(<table>,'anchor') string
- tostring(<function>,'anchor') string
- tostring(<thread>,'anchor') string
--- checkallerrors
- tostring() ...bad argument...
====== type ======
--- checkallpass
- type('abc') 'string'
- type(1.25) 'number'
- type(true) 'boolean'
- type(<table>) 'table'
- type(<function>) 'function'
- type(<thread>) 'thread'
--- checkallpass
- type(nil,'anchor') 'nil'
- type('abc','anchor') 'string'
- type(1.25,'anchor') 'number'
- type(true,'anchor') 'boolean'
- type(<table>,'anchor') 'table'
- type(<function>,'anchor') 'function'
- type(<thread>,'anchor') 'thread'
--- checkallerrors
- type() ...bad argument...
====== xpcall ======
--- checkallpass
- xpcall('abc','abc') false,'error in error handling'
- xpcall(1.25,'abc') false,'error in error handling'
- xpcall(true,'abc') false,'error in error handling'
- xpcall(<table>,'abc') false,'error in error handling'
- xpcall(<function>,'abc') true
- xpcall(<thread>,'abc') false,'error in error handling'
- xpcall('abc',1.25) false,'error in error handling'
- xpcall(1.25,1.25) false,'error in error handling'
- xpcall(true,1.25) false,'error in error handling'
- xpcall(<table>,1.25) false,'error in error handling'
- xpcall(<function>,1.25) true
- xpcall(<thread>,1.25) false,'error in error handling'
- xpcall('abc',true) false,'error in error handling'
- xpcall(1.25,true) false,'error in error handling'
- xpcall(true,true) false,'error in error handling'
- xpcall(<table>,true) false,'error in error handling'
- xpcall(<function>,true) true
- xpcall(<thread>,true) false,'error in error handling'
- xpcall('abc',<table>) false,'error in error handling'
- xpcall(1.25,<table>) false,'error in error handling'
- xpcall(true,<table>) false,'error in error handling'
- xpcall(<table>,<table>) false,'error in error handling'
- xpcall(<function>,<table>) true
- xpcall(<thread>,<table>) false,'error in error handling'
- xpcall('abc',<thread>) false,'error in error handling'
- xpcall(1.25,<thread>) false,'error in error handling'
- xpcall(true,<thread>) false,'error in error handling'
- xpcall(<table>,<thread>) false,'error in error handling'
- xpcall(<function>,<thread>) true
- xpcall(<thread>,<thread>) false,'error in error handling'
--- checkallpass
- xpcall('abc',<function>) false,'aaa'
- xpcall(1.25,<function>) false,'aaa'
- xpcall(true,<function>) false,'aaa'
- xpcall(<table>,<function>) false,'aaa'
- xpcall(<function>,<function>) true
- xpcall(<thread>,<function>) false,'aaa'
--- checkallerrors
- xpcall(nil) ...bad argument...
- xpcall('abc') ...bad argument...
- xpcall(1.25) ...bad argument...
- xpcall(true) ...bad argument...
- xpcall(<table>) ...bad argument...
- xpcall(<function>) ...bad argument...
- xpcall(<thread>) ...bad argument...

View File

@@ -0,0 +1,65 @@
====== coroutine.create ======
--- checkallpass
- coroutine.create(<function>) <thread>
--- checkallerrors
- coroutine.create(nil) ...bad argument...
- coroutine.create('abc') ...bad argument...
- coroutine.create(1.25) ...bad argument...
- coroutine.create(true) ...bad argument...
- coroutine.create(<table>) ...bad argument...
- coroutine.create(<thread>) ...bad argument...
====== coroutine.resume ======
--- checkallpass
- coroutine.resume(<thread>,nil) true
- coroutine.resume(<thread>,'abc') true
- coroutine.resume(<thread>,1.25) true
- coroutine.resume(<thread>,true) true
- coroutine.resume(<thread>,<table>) true
- coroutine.resume(<thread>,<function>) true
- coroutine.resume(<thread>,<thread>) true
--- checkallerrors
- coroutine.resume(nil) ...bad argument...
- coroutine.resume('abc') ...bad argument...
- coroutine.resume(1.25) ...bad argument...
- coroutine.resume(true) ...bad argument...
- coroutine.resume(<table>) ...bad argument...
- coroutine.resume(<function>) ...bad argument...
====== coroutine.running ======
--- checkallpass
- coroutine.running(nil) <thread>,true
- coroutine.running('abc') <thread>,true
- coroutine.running(1.25) <thread>,true
- coroutine.running(true) <thread>,true
- coroutine.running(<table>) <thread>,true
- coroutine.running(<function>) <thread>,true
- coroutine.running(<thread>) <thread>,true
====== coroutine.status ======
--- checkallpass
- coroutine.status(<thread>) 'suspended'
--- checkallerrors
- coroutine.status(nil) ...bad argument...
- coroutine.status('abc') ...bad argument...
- coroutine.status(1.25) ...bad argument...
- coroutine.status(true) ...bad argument...
- coroutine.status(<table>) ...bad argument...
- coroutine.status(<function>) ...bad argument...
====== coroutine.wrap ======
--- checkallpass
- coroutine.wrap(<function>) <function>
--- checkallerrors
- coroutine.wrap(nil) ...bad argument...
- coroutine.wrap('abc') ...bad argument...
- coroutine.wrap(1.25) ...bad argument...
- coroutine.wrap(true) ...bad argument...
- coroutine.wrap(<table>) ...bad argument...
- coroutine.wrap(<thread>) ...bad argument...
====== coroutine.yield ======
status suspended
true
status suspended
yield abc 1.25
true abc 1.25 true
status suspended
yield abc 1.25
false error within coroutine thread
status dead

View File

@@ -0,0 +1,452 @@
====== debug.debug - no tests ======
====== debug.gethook ======
--- checkallpass
- debug.gethook() nil,'',0
====== debug.getinfo ======
--- checkallpass
- debug.getinfo(<function>) <table>
- debug.getinfo(25)
- debug.getinfo('25')
--- checkallpass
- debug.getinfo(<function>) <table>
- debug.getinfo(25)
- debug.getinfo('25')
--- checkallpass
- debug.getinfo(<function>,'') <table>
- debug.getinfo(25,'')
- debug.getinfo('25','')
- debug.getinfo(<function>,'n') <table>
- debug.getinfo(25,'n')
- debug.getinfo('25','n')
- debug.getinfo(<function>,'flnStu') <table>
- debug.getinfo(25,'flnStu')
- debug.getinfo('25','flnStu')
--- checkallpass
fail debug.getinfo('') 'bad argument #1 to 'debug.getinfo' (function or level expected)'
fail debug.getinfo('n') 'bad argument #1 to 'debug.getinfo' (function or level expected)'
fail debug.getinfo('flnStu') 'bad argument #1 to 'debug.getinfo' (function or level expected)'
--- checkallerrors
- debug.getinfo() ...function or level...
--- checkallerrors
- debug.getinfo(nil) ...function or level...
- debug.getinfo('abc') ...function or level...
- debug.getinfo(true) ...function or level...
- debug.getinfo(<thread>) ...function or level...
--- checkallerrors
- debug.getinfo(<function>,true) ...string expected...
- debug.getinfo(<function>,<table>) ...string expected...
- debug.getinfo(<function>,<function>) ...string expected...
- debug.getinfo(<function>,<thread>) ...string expected...
--- checkallerrors
- debug.getinfo(nil,<function>) ...string expected...
- debug.getinfo('abc',<function>) ...string expected...
- debug.getinfo(true,<function>) ...string expected...
--- checkallerrors
- debug.getinfo('abc',<function>,'abc') ...string expected...
- debug.getinfo(1.25,<function>,'abc') ...string expected...
- debug.getinfo(true,<function>,'abc') ...string expected...
- debug.getinfo(<table>,<function>,'abc') ...string expected...
- debug.getinfo(<function>,<function>,'abc') ...string expected...
--- checkallerrors
badmsg debug.getinfo('qzQZ') template='invalid option' actual='bad argument #1 to 'debug.getinfo' (function or level expected)'
====== debug.getlocal ======
f: x,y,a,b,p,q 1 2 nil nil p q
--- checkallpass
- debug.getlocal(<function>,1) 'x'
- debug.getlocal(1,1) '(*temporary)'
- debug.getlocal(<function>,'2') 'y'
- debug.getlocal(1,'2')
--- checkallpass
- debug.getlocal(<thread>,<function>,1) 'x'
--- checkallerrors
- debug.getlocal() ...number expected...
--- checkallerrors
- debug.getlocal(<function>,nil) ...number expected...
- debug.getlocal(25,nil) ...number expected...
- debug.getlocal('25',nil) ...number expected...
- debug.getlocal(<function>,'abc') ...number expected...
- debug.getlocal(25,'abc') ...number expected...
- debug.getlocal('25','abc') ...number expected...
- debug.getlocal(<function>,true) ...number expected...
- debug.getlocal(25,true) ...number expected...
- debug.getlocal('25',true) ...number expected...
- debug.getlocal(<function>,<table>) ...number expected...
- debug.getlocal(25,<table>) ...number expected...
- debug.getlocal('25',<table>) ...number expected...
- debug.getlocal(<function>,<function>) ...number expected...
- debug.getlocal(25,<function>) ...number expected...
- debug.getlocal('25',<function>) ...number expected...
- debug.getlocal(<function>,<thread>) ...number expected...
- debug.getlocal(25,<thread>) ...number expected...
- debug.getlocal('25',<thread>) ...number expected...
--- checkallerrors
- debug.getlocal(nil,1.25) ...number expected...
- debug.getlocal('abc',1.25) ...number expected...
- debug.getlocal(true,1.25) ...number expected...
- debug.getlocal(<thread>,1.25) ...number expected...
- debug.getlocal(nil,'789') ...number expected...
- debug.getlocal('abc','789') ...number expected...
- debug.getlocal(true,'789') ...number expected...
- debug.getlocal(<thread>,'789') ...number expected...
--- checkallerrors
- debug.getlocal(<thread>,<function>) ...got no value...
- debug.getlocal(<thread>,25) ...got no value...
- debug.getlocal(<thread>,'25') ...got no value...
--- checkallerrors
- debug.getlocal('abc',<function>,1) ...number expected...
- debug.getlocal(1.25,<function>,1) ...number expected...
- debug.getlocal(true,<function>,1) ...number expected...
- debug.getlocal(<table>,<function>,1) ...number expected...
- debug.getlocal(<function>,<function>,1) ...number expected...
- debug.getlocal('abc',<function>,'2') ...number expected...
- debug.getlocal(1.25,<function>,'2') ...number expected...
- debug.getlocal(true,<function>,'2') ...number expected...
- debug.getlocal(<table>,<function>,'2') ...number expected...
- debug.getlocal(<function>,<function>,'2') ...number expected...
--- checkallerrors
- debug.getlocal(<thread>,100,1) ...level out of range...
====== debug.getmetatable ======
--- checkallpass
- debug.getmetatable(nil)
- debug.getmetatable('abc') <table>
- debug.getmetatable(1.25)
- debug.getmetatable(true)
- debug.getmetatable(<table>)
- debug.getmetatable(<function>)
- debug.getmetatable(<thread>)
--- checkallerrors
- debug.getmetatable() ...value expected...
====== debug.getregistry ======
--- checkallpass
- debug.getregistry() <table>
--- checkallpass
- debug.getregistry(nil) <table>
- debug.getregistry('abc') <table>
- debug.getregistry(1.25) <table>
- debug.getregistry(true) <table>
- debug.getregistry(<table>) <table>
- debug.getregistry(<function>) <table>
- debug.getregistry(<thread>) <table>
====== debug.getupvalue ======
--- checkallpass
- debug.getupvalue(<function>,1) '_ENV',<table>
- debug.getupvalue(<function>,'2') 'p','p'
--- checkallerrors
- debug.getupvalue() ...number expected...
--- checkallerrors
- debug.getupvalue(nil,1) ...function expected...
- debug.getupvalue('abc',1) ...function expected...
- debug.getupvalue(1.25,1) ...function expected...
- debug.getupvalue(true,1) ...function expected...
- debug.getupvalue(<table>,1) ...function expected...
- debug.getupvalue(<thread>,1) ...function expected...
- debug.getupvalue(nil,'2') ...function expected...
- debug.getupvalue('abc','2') ...function expected...
- debug.getupvalue(1.25,'2') ...function expected...
- debug.getupvalue(true,'2') ...function expected...
- debug.getupvalue(<table>,'2') ...function expected...
- debug.getupvalue(<thread>,'2') ...function expected...
--- checkallerrors
- debug.getupvalue(<function>,nil) ...number expected...
- debug.getupvalue(<function>,'abc') ...number expected...
- debug.getupvalue(<function>,true) ...number expected...
- debug.getupvalue(<function>,<table>) ...number expected...
- debug.getupvalue(<function>,<function>) ...number expected...
- debug.getupvalue(<function>,<thread>) ...number expected...
--- checkallpass
- debug.getuservalue()
--- checkallpass
- debug.getuservalue(nil)
- debug.getuservalue('abc')
- debug.getuservalue(1.25)
- debug.getuservalue(true)
- debug.getuservalue(<table>)
- debug.getuservalue(<function>)
- debug.getuservalue(<thread>)
--- checkallpass
- debug.sethook()
--- checkallpass
--- checkallpass
- debug.sethook(<function>,'cr')
- debug.sethook(<function>,'l')
--- checkallpass
- debug.sethook(nil,<function>,'cr')
- debug.sethook(<thread>,<function>,'cr')
- debug.sethook(nil,<function>,'l')
- debug.sethook(<thread>,<function>,'l')
--- checkallerrors
- debug.sethook('abc') ...string expected...
- debug.sethook(<function>) ...string expected...
- debug.sethook(true) ...string expected...
--- checkallerrors
- debug.sethook('abc',nil,'cr') ...string expected...
- debug.sethook(<function>,nil,'cr') ...string expected...
- debug.sethook(true,nil,'cr') ...string expected...
- debug.sethook('abc',<function>,'cr') ...string expected...
- debug.sethook(<function>,<function>,'cr') ...string expected...
- debug.sethook(true,<function>,'cr') ...string expected...
- debug.sethook('abc',nil,'l') ...string expected...
- debug.sethook(<function>,nil,'l') ...string expected...
- debug.sethook(true,nil,'l') ...string expected...
- debug.sethook('abc',<function>,'l') ...string expected...
- debug.sethook(<function>,<function>,'l') ...string expected...
- debug.sethook(true,<function>,'l') ...string expected...
====== debug.setlocal ======
f: x,y,a,b,p,q 1 2 nil nil p q
--- checkallpass
- debug.setlocal(1,1,nil) '(*temporary)'
- debug.setlocal(1,1,'foo') '(*temporary)'
f: x,y,a,b,p,q 1 2 1 2 p q
--- checkallpass
- debug.setlocal(<thread>,1,2,nil)
- debug.setlocal(<thread>,1,2,'bar')
f: x,y,a,b,p,q 1 2 1 2 p q
--- checkallerrors
- debug.setlocal() ...number expected...
--- checkallerrors
- debug.setlocal(1) ...value expected...
--- checkallerrors
- debug.setlocal(1,1) ...value expected...
--- checkallerrors
- debug.setlocal(<thread>,1,2) ...value expected...
--- checkallerrors
- debug.setlocal(<table>,1) ...number expected...
- debug.setlocal('abc',1) ...number expected...
--- checkallerrors
- debug.setlocal(1,'abc') ...value expected...
- debug.setlocal(1,true) ...value expected...
- debug.setlocal(1,<table>) ...value expected...
- debug.setlocal(1,<function>) ...value expected...
- debug.setlocal(1,<thread>) ...value expected...
--- checkallerrors
- debug.setlocal(<table>,1,1,nil) ...number expected...
- debug.setlocal('abc',1,1,nil) ...number expected...
- debug.setlocal(<table>,1,1,'foo') ...number expected...
- debug.setlocal('abc',1,1,'foo') ...number expected...
--- checkallerrors
- debug.setlocal(10,1,'foo') ...level out of range...
====== debug.setmetatable ======
--- checkallpass
- debug.setmetatable(nil,<table>)
- debug.setmetatable('abc',<table>) 'abc'
- debug.setmetatable(1.25,<table>) 1.25
- debug.setmetatable(true,<table>) true
- debug.setmetatable(<table>,<table>) <table>
- debug.setmetatable(<function>,<table>) <function>
- debug.setmetatable(<thread>,<table>) <thread>
- debug.setmetatable(nil,nil)
- debug.setmetatable('abc',nil) 'abc'
- debug.setmetatable(1.25,nil) 1.25
- debug.setmetatable(true,nil) true
- debug.setmetatable(<table>,nil) <table>
- debug.setmetatable(<function>,nil) <function>
- debug.setmetatable(<thread>,nil) <thread>
--- checkallerrors
- debug.setmetatable() ...nil or table...
--- checkallerrors
- debug.setmetatable(nil) ...nil or table...
- debug.setmetatable('abc') ...nil or table...
- debug.setmetatable(1.25) ...nil or table...
- debug.setmetatable(true) ...nil or table...
- debug.setmetatable(<table>) ...nil or table...
- debug.setmetatable(<function>) ...nil or table...
- debug.setmetatable(<thread>) ...nil or table...
====== debug.setupvalue ======
--- checkallpass
- debug.setupvalue(<function>,2,nil) 'p'
- debug.setupvalue(<function>,'3',nil) 'q'
- debug.setupvalue(<function>,2,true) 'p'
- debug.setupvalue(<function>,'3',true) 'q'
- debug.setupvalue(<function>,2,'abc') 'p'
- debug.setupvalue(<function>,'3','abc') 'q'
p,q abc abc
--- checkallerrors
- debug.setupvalue() ...value expected...
--- checkallerrors
- debug.setupvalue(<function>) ...value expected...
--- checkallerrors
- debug.setupvalue(<function>,2) ...value expected...
--- checkallerrors
- debug.setupvalue(nil,2) ...value expected...
- debug.setupvalue('abc',2) ...value expected...
- debug.setupvalue(1.25,2) ...value expected...
- debug.setupvalue(true,2) ...value expected...
- debug.setupvalue(<table>,2) ...value expected...
- debug.setupvalue(<thread>,2) ...value expected...
--- checkallerrors
- debug.setupvalue(<function>,nil) ...value expected...
- debug.setupvalue(<function>,'abc') ...value expected...
- debug.setupvalue(<function>,true) ...value expected...
- debug.setupvalue(<function>,<table>) ...value expected...
- debug.setupvalue(<function>,<function>) ...value expected...
- debug.setupvalue(<function>,<thread>) ...value expected...
====== debug.setuservalue ======
--- checkallerrors
- debug.setuservalue() ...userdata expected...
--- checkallerrors
- debug.setuservalue(nil) ...userdata expected...
- debug.setuservalue('abc') ...userdata expected...
- debug.setuservalue(1.25) ...userdata expected...
- debug.setuservalue(true) ...userdata expected...
- debug.setuservalue(<table>) ...userdata expected...
- debug.setuservalue(<function>) ...userdata expected...
- debug.setuservalue(<thread>) ...userdata expected...
--- checkallerrors
- debug.setuservalue(nil,'abc') ...userdata expected...
- debug.setuservalue('abc','abc') ...userdata expected...
- debug.setuservalue(1.25,'abc') ...userdata expected...
- debug.setuservalue(true,'abc') ...userdata expected...
- debug.setuservalue(<table>,'abc') ...userdata expected...
- debug.setuservalue(<function>,'abc') ...userdata expected...
- debug.setuservalue(<thread>,'abc') ...userdata expected...
- debug.setuservalue(nil,1.25) ...userdata expected...
- debug.setuservalue('abc',1.25) ...userdata expected...
- debug.setuservalue(1.25,1.25) ...userdata expected...
- debug.setuservalue(true,1.25) ...userdata expected...
- debug.setuservalue(<table>,1.25) ...userdata expected...
- debug.setuservalue(<function>,1.25) ...userdata expected...
- debug.setuservalue(<thread>,1.25) ...userdata expected...
====== debug.traceback ======
--- checkallpass
- debug.traceback() 'stack traceback:
[C]: in function 'pcall'
args.lua:143: in function 'invoke'
args.lua:167: in function 'checkallpass'
debuglibargs.lua:127: in main chunk
[C]: in ?'
--- checkallpass
- debug.traceback('abc') 'abc
stack traceback:
[C]: in function 'pcall'
args.lua:143: in function 'invoke'
args.lua:167: in function 'checkallpass'
debuglibargs.lua:128: in main chunk
[C]: in ?'
--- checkallpass
- debug.traceback('abc',1.25) 'abc
stack traceback:
[C]: in function 'pcall'
args.lua:143: in function 'invoke'
args.lua:167: in function 'checkallpass'
debuglibargs.lua:129: in main chunk
[C]: in ?'
--- checkallpass
- debug.traceback(<thread>) 'stack traceback:
[C]: in function 'pcall'
args.lua:143: in function 'invoke'
args.lua:167: in function 'checkallpass'
debuglibargs.lua:130: in main chunk
[C]: in ?'
--- checkallpass
- debug.traceback(<thread>,'abc') 'abc
stack traceback:
[C]: in function 'pcall'
args.lua:143: in function 'invoke'
args.lua:167: in function 'checkallpass'
debuglibargs.lua:131: in main chunk
[C]: in ?'
--- checkallpass
- debug.traceback(<thread>,'abc',1.25) 'abc
stack traceback:
[C]: in function 'pcall'
args.lua:143: in function 'invoke'
args.lua:167: in function 'checkallpass'
debuglibargs.lua:132: in main chunk
[C]: in ?'
--- checkallpass
- debug.traceback(<function>) <function>
- debug.traceback(true) true
- debug.traceback(<table>) <table>
--- checkallpass
- debug.traceback(<function>,nil) <function>
- debug.traceback(true,nil) true
- debug.traceback(<table>,nil) <table>
- debug.traceback(<function>,'abc') <function>
- debug.traceback(true,'abc') true
- debug.traceback(<table>,'abc') <table>
- debug.traceback(<function>,true) <function>
- debug.traceback(true,true) true
- debug.traceback(<table>,true) <table>
- debug.traceback(<function>,<table>) <function>
- debug.traceback(true,<table>) true
- debug.traceback(<table>,<table>) <table>
- debug.traceback(<function>,<function>) <function>
- debug.traceback(true,<function>) true
- debug.traceback(<table>,<function>) <table>
- debug.traceback(<function>,<thread>) <function>
- debug.traceback(true,<thread>) true
- debug.traceback(<table>,<thread>) <table>
====== debug.upvalueid ======
--- checkallpass
- debug.upvalueid(<function>,1) <userdata>
- debug.upvalueid(<function>,'2') <userdata>
--- checkallerrors
- debug.upvalueid() ...number expected...
--- checkallerrors
- debug.upvalueid(nil,1) ...function expected...
- debug.upvalueid('abc',1) ...function expected...
- debug.upvalueid(1.25,1) ...function expected...
- debug.upvalueid(true,1) ...function expected...
- debug.upvalueid(<table>,1) ...function expected...
- debug.upvalueid(<thread>,1) ...function expected...
- debug.upvalueid(nil,'2') ...function expected...
- debug.upvalueid('abc','2') ...function expected...
- debug.upvalueid(1.25,'2') ...function expected...
- debug.upvalueid(true,'2') ...function expected...
- debug.upvalueid(<table>,'2') ...function expected...
- debug.upvalueid(<thread>,'2') ...function expected...
--- checkallerrors
- debug.upvalueid(<function>,nil) ...number expected...
- debug.upvalueid(<function>,'abc') ...number expected...
- debug.upvalueid(<function>,true) ...number expected...
- debug.upvalueid(<function>,<table>) ...number expected...
- debug.upvalueid(<function>,<function>) ...number expected...
- debug.upvalueid(<function>,<thread>) ...number expected...
====== debug.upvaluejoin ======
--- checkallpass
- debug.upvaluejoin(<function>,1,<function>,1)
- debug.upvaluejoin(<function>,'2',<function>,1)
- debug.upvaluejoin(<function>,1,<function>,'2')
- debug.upvaluejoin(<function>,'2',<function>,'2')
--- checkallerrors
- debug.upvaluejoin() ...number expected...
--- checkallerrors
- debug.upvaluejoin(nil,1) ...function expected...
- debug.upvaluejoin('abc',1) ...function expected...
- debug.upvaluejoin(1.25,1) ...function expected...
- debug.upvaluejoin(true,1) ...function expected...
- debug.upvaluejoin(<table>,1) ...function expected...
- debug.upvaluejoin(<thread>,1) ...function expected...
- debug.upvaluejoin(nil,'2') ...function expected...
- debug.upvaluejoin('abc','2') ...function expected...
- debug.upvaluejoin(1.25,'2') ...function expected...
- debug.upvaluejoin(true,'2') ...function expected...
- debug.upvaluejoin(<table>,'2') ...function expected...
- debug.upvaluejoin(<thread>,'2') ...function expected...
--- checkallerrors
- debug.upvaluejoin(<function>,nil) ...number expected...
- debug.upvaluejoin(<function>,'abc') ...number expected...
- debug.upvaluejoin(<function>,true) ...number expected...
- debug.upvaluejoin(<function>,<table>) ...number expected...
- debug.upvaluejoin(<function>,<function>) ...number expected...
- debug.upvaluejoin(<function>,<thread>) ...number expected...
--- checkallerrors
- debug.upvaluejoin(<function>,1,nil,1) ...function expected...
- debug.upvaluejoin(<function>,1,'abc',1) ...function expected...
- debug.upvaluejoin(<function>,1,1.25,1) ...function expected...
- debug.upvaluejoin(<function>,1,true,1) ...function expected...
- debug.upvaluejoin(<function>,1,<table>,1) ...function expected...
- debug.upvaluejoin(<function>,1,<thread>,1) ...function expected...
- debug.upvaluejoin(<function>,1,nil,'2') ...function expected...
- debug.upvaluejoin(<function>,1,'abc','2') ...function expected...
- debug.upvaluejoin(<function>,1,1.25,'2') ...function expected...
- debug.upvaluejoin(<function>,1,true,'2') ...function expected...
- debug.upvaluejoin(<function>,1,<table>,'2') ...function expected...
- debug.upvaluejoin(<function>,1,<thread>,'2') ...function expected...
--- checkallerrors
- debug.upvaluejoin(<function>,1,<function>,nil) ...number expected...
- debug.upvaluejoin(<function>,1,<function>,'abc') ...number expected...
- debug.upvaluejoin(<function>,1,<function>,true) ...number expected...
- debug.upvaluejoin(<function>,1,<function>,<table>) ...number expected...
- debug.upvaluejoin(<function>,1,<function>,<function>) ...number expected...
- debug.upvaluejoin(<function>,1,<function>,<thread>) ...number expected...

View File

@@ -0,0 +1,202 @@
====== io.close ======
--- checkallpass
- io.close(<userdata>) true
--- checkallerrors
- io.close('abc') ...bad argument...
- io.close(1.25) ...bad argument...
- io.close(true) ...bad argument...
- io.close(<table>) ...bad argument...
- io.close(<function>) ...bad argument...
- io.close(<thread>) ...bad argument...
====== io.input ======
--- checkallpass
- io.input(nil) <userdata>
- io.input(<userdata>) <userdata>
- io.input('abc.txt') <userdata>
--- checkallerrors
- io.input(true) ...bad argument...
- io.input(<table>) ...bad argument...
- io.input(<function>) ...bad argument...
- io.input(<thread>) ...bad argument...
====== io.lines ======
--- checkallpass
- io.lines('abc.txt') <function>
--- checkallerrors
- io.lines(<userdata>) ...bad argument...
--- checkallerrors
needcheck io.lines(nil) function: 0x100112cf0
- io.lines(true) ...bad argument...
- io.lines(<table>) ...bad argument...
- io.lines(<function>) ...bad argument...
- io.lines(<thread>) ...bad argument...
====== io.open ======
--- checkallpass
- io.open('abc.txt',nil) <userdata>
- io.open('abc.txt','r') <userdata>
- io.open('abc.txt','w') <userdata>
- io.open('abc.txt','a') <userdata>
- io.open('abc.txt','r+') <userdata>
- io.open('abc.txt','w+') <userdata>
- io.open('abc.txt','a+') <userdata>
--- checkallerrors
- io.open(nil) ...bad argument...
- io.open(true) ...bad argument...
- io.open(<table>) ...bad argument...
- io.open(<function>) ...bad argument...
- io.open(<thread>) ...bad argument...
--- checkallerrors
- io.open('abc.txt',<table>) ...bad argument...
====== io.output ======
--- checkallpass
- io.output(nil) <userdata>
- io.output(<userdata>) <userdata>
- io.output('abc.txt') <userdata>
--- checkallerrors
- io.output(true) ...bad argument...
- io.output(<table>) ...bad argument...
- io.output(<function>) ...bad argument...
- io.output(<thread>) ...bad argument...
====== io.popen ======
--- checkallerrors
- io.popen(nil) ...bad argument...
- io.popen(true) ...bad argument...
- io.popen(<table>) ...bad argument...
- io.popen(<function>) ...bad argument...
- io.popen(<thread>) ...bad argument...
--- checkallerrors
- io.popen('hostname',<table>) ...bad argument...
====== io.read ======
--- checkallpass
- io.read()
--- checkallpass
- io.read(2)
- io.read('*n')
- io.read('*a') ''
- io.read('*l')
--- checkallpass
- io.read(2,2)
- io.read('*n',2)
- io.read('*a',2) ''
- io.read('*l',2)
- io.read(2,'*a')
- io.read('*n','*a')
- io.read('*a','*a') '',''
- io.read('*l','*a')
- io.read(2,'*l')
- io.read('*n','*l')
- io.read('*a','*l') ''
- io.read('*l','*l')
--- checkallerrors
- io.read(true) ...bad argument...
- io.read(<function>) ...bad argument...
- io.read(<table>) ...bad argument...
- io.read('3') ...bad argument...
====== io.write ======
--- checkallpass
- io.write() <userdata>
--- checkallpass
- io.write('abc') <userdata>
- io.write(1.25) <userdata>
--- checkallpass
- io.write('abc','abc') <userdata>
- io.write(1.25,'abc') <userdata>
- io.write('abc',1.25) <userdata>
- io.write(1.25,1.25) <userdata>
--- checkallerrors
- io.write(true) ...bad argument...
- io.write(<table>) ...bad argument...
- io.write(<function>) ...bad argument...
- io.write(<thread>) ...bad argument...
--- checkallerrors
- io.write('abc',true) ...bad argument...
- io.write(1.25,true) ...bad argument...
- io.write('abc',<table>) ...bad argument...
- io.write(1.25,<table>) ...bad argument...
- io.write('abc',<function>) ...bad argument...
- io.write(1.25,<function>) ...bad argument...
- io.write('abc',<thread>) ...bad argument...
- io.write(1.25,<thread>) ...bad argument...
====== file:write ======
--- checkallpass
- file.write(<userdata>,'abc') <userdata>
- file.write(<userdata>,1.25) <userdata>
--- checkallpass
- file.write(<userdata>,'abc','abc') <userdata>
- file.write(<userdata>,1.25,'abc') <userdata>
- file.write(<userdata>,'abc',1.25) <userdata>
- file.write(<userdata>,1.25,1.25) <userdata>
--- checkallerrors
- file.write() ...bad argument...
--- checkallerrors
- file.write(<userdata>,true) ...bad argument...
- file.write(<userdata>,<table>) ...bad argument...
- file.write(<userdata>,<function>) ...bad argument...
- file.write(<userdata>,<thread>) ...bad argument...
--- checkallerrors
- file.write(<userdata>,'abc',true) ...bad argument...
- file.write(<userdata>,1.25,true) ...bad argument...
- file.write(<userdata>,'abc',<table>) ...bad argument...
- file.write(<userdata>,1.25,<table>) ...bad argument...
- file.write(<userdata>,'abc',<function>) ...bad argument...
- file.write(<userdata>,1.25,<function>) ...bad argument...
- file.write(<userdata>,'abc',<thread>) ...bad argument...
- file.write(<userdata>,1.25,<thread>) ...bad argument...
====== file:seek ======
--- checkallpass
- file.seek(<userdata>) 0
--- checkallpass
- file.seek(<userdata>,'set') 0
- file.seek(<userdata>,'cur') 0
- file.seek(<userdata>,'end') 63
--- checkallpass
- file.seek(<userdata>,'set',2) 2
- file.seek(<userdata>,'cur',2) 4
- file.seek(<userdata>,'end',2) 65
- file.seek(<userdata>,'set','3') 3
- file.seek(<userdata>,'cur','3') 6
- file.seek(<userdata>,'end','3') 66
--- checkallerrors
- file.seek() ...bad argument...
--- checkallerrors
- file.seek(<userdata>,true) ...bad argument...
- file.seek(<userdata>,<table>) ...bad argument...
- file.seek(<userdata>,<function>) ...bad argument...
- file.seek(<userdata>,<thread>) ...bad argument...
--- checkallerrors
- file.seek(<userdata>,'set','abc') ...bad argument...
- file.seek(<userdata>,'cur','abc') ...bad argument...
- file.seek(<userdata>,'end','abc') ...bad argument...
- file.seek(<userdata>,'set',true) ...bad argument...
- file.seek(<userdata>,'cur',true) ...bad argument...
- file.seek(<userdata>,'end',true) ...bad argument...
- file.seek(<userdata>,'set',<table>) ...bad argument...
- file.seek(<userdata>,'cur',<table>) ...bad argument...
- file.seek(<userdata>,'end',<table>) ...bad argument...
- file.seek(<userdata>,'set',<function>) ...bad argument...
- file.seek(<userdata>,'cur',<function>) ...bad argument...
- file.seek(<userdata>,'end',<function>) ...bad argument...
- file.seek(<userdata>,'set',<thread>) ...bad argument...
- file.seek(<userdata>,'cur',<thread>) ...bad argument...
- file.seek(<userdata>,'end',<thread>) ...bad argument...
====== file:setvbuf ======
--- checkallpass
- file.setvbuf(<userdata>,'no') true
- file.setvbuf(<userdata>,'full') true
- file.setvbuf(<userdata>,'line') true
--- checkallpass
- file.setvbuf(<userdata>,'full',1024) true
- file.setvbuf(<userdata>,'full','512') true
--- checkallerrors
- file.setvbuf() ...bad argument...
--- checkallerrors
- file.setvbuf(<userdata>,nil) ...bad argument...
- file.setvbuf(<userdata>,true) ...bad argument...
- file.setvbuf(<userdata>,<table>) ...bad argument...
- file.setvbuf(<userdata>,<function>) ...bad argument...
- file.setvbuf(<userdata>,<thread>) ...bad argument...
--- checkallerrors
- file.setvbuf(<userdata>,'full','abc') ...bad argument...
- file.setvbuf(<userdata>,'full',true) ...bad argument...
- file.setvbuf(<userdata>,'full',<table>) ...bad argument...
- file.setvbuf(<userdata>,'full',<function>) ...bad argument...
- file.setvbuf(<userdata>,'full',<thread>) ...bad argument...

View File

@@ -0,0 +1,750 @@
====== math.abs ======
--- checkallpass
- math.abs(1) 1
- math.abs(0.75) 0.75
- math.abs('-1') 1
- math.abs('-0.25') 0.25
--- checkallerrors
- math.abs(nil) ...bad argument...
- math.abs('abc') ...bad argument...
- math.abs(true) ...bad argument...
- math.abs(<function>) ...bad argument...
- math.abs(<table>) ...bad argument...
- math.abs(<thread>) ...bad argument...
====== math.acos ======
--- checkallpass
- math.acos(1) 0
- math.acos(0.75) 0.722...
- math.acos('-1') 3.141...
- math.acos('-0.25') 1.823...
--- checkallerrors
- math.acos(nil) ...bad argument...
- math.acos('abc') ...bad argument...
- math.acos(true) ...bad argument...
- math.acos(<function>) ...bad argument...
- math.acos(<table>) ...bad argument...
- math.acos(<thread>) ...bad argument...
====== math.asin ======
--- checkallpass
- math.asin(1) 1.570...
- math.asin(0.75) 0.848...
- math.asin('-1') -1.57...
- math.asin('-0.25') -0.25...
--- checkallerrors
- math.asin(nil) ...bad argument...
- math.asin('abc') ...bad argument...
- math.asin(true) ...bad argument...
- math.asin(<function>) ...bad argument...
- math.asin(<table>) ...bad argument...
- math.asin(<thread>) ...bad argument...
====== math.atan ======
--- checkallpass
- math.atan(1) 0.785...
- math.atan(0.75) 0.643...
- math.atan('-1') -0.78...
- math.atan('-0.25') -0.24...
--- checkallerrors
- math.atan(nil) ...bad argument...
- math.atan('abc') ...bad argument...
- math.atan(true) ...bad argument...
- math.atan(<function>) ...bad argument...
- math.atan(<table>) ...bad argument...
- math.atan(<thread>) ...bad argument...
====== math.cos ======
--- checkallpass
- math.cos(1) 0.540...
- math.cos(0.75) 0.731...
- math.cos('-1') 0.540...
- math.cos('-0.25') 0.968...
--- checkallerrors
- math.cos(nil) ...bad argument...
- math.cos('abc') ...bad argument...
- math.cos(true) ...bad argument...
- math.cos(<function>) ...bad argument...
- math.cos(<table>) ...bad argument...
- math.cos(<thread>) ...bad argument...
====== math.cosh ======
--- checkallpass
- math.cosh(1) 1.543...
- math.cosh(0.75) 1.294...
- math.cosh('-1') 1.543...
- math.cosh('-0.25') 1.031...
--- checkallerrors
- math.cosh(nil) ...bad argument...
- math.cosh('abc') ...bad argument...
- math.cosh(true) ...bad argument...
- math.cosh(<function>) ...bad argument...
- math.cosh(<table>) ...bad argument...
- math.cosh(<thread>) ...bad argument...
====== math.deg ======
--- checkallpass
- math.deg(1) 57.29...
- math.deg(0.75) 42.97...
- math.deg('-1') -57.2...
- math.deg('-0.25') -14.3...
--- checkallerrors
- math.deg(nil) ...bad argument...
- math.deg('abc') ...bad argument...
- math.deg(true) ...bad argument...
- math.deg(<function>) ...bad argument...
- math.deg(<table>) ...bad argument...
- math.deg(<thread>) ...bad argument...
====== math.exp ======
--- checkallpass
- math.exp(1) 2.718...
- math.exp(0.75) 2.117...
- math.exp('-1') 0.367...
- math.exp('-0.25') 0.778...
--- checkallerrors
- math.exp(nil) ...bad argument...
- math.exp('abc') ...bad argument...
- math.exp(true) ...bad argument...
- math.exp(<function>) ...bad argument...
- math.exp(<table>) ...bad argument...
- math.exp(<thread>) ...bad argument...
====== math.floor ======
--- checkallpass
- math.floor(1) 1
- math.floor(0.75) 0
- math.floor('-1') -1
- math.floor('-0.25') -1
--- checkallerrors
- math.floor(nil) ...bad argument...
- math.floor('abc') ...bad argument...
- math.floor(true) ...bad argument...
- math.floor(<function>) ...bad argument...
- math.floor(<table>) ...bad argument...
- math.floor(<thread>) ...bad argument...
====== math.rad ======
--- checkallpass
- math.rad(1) 0.017...
- math.rad(0.75) 0.013...
- math.rad('-1') -0.01...
- math.rad('-0.25') -0.00...
--- checkallerrors
- math.rad(nil) ...bad argument...
- math.rad('abc') ...bad argument...
- math.rad(true) ...bad argument...
- math.rad(<function>) ...bad argument...
- math.rad(<table>) ...bad argument...
- math.rad(<thread>) ...bad argument...
====== math.randomseed ======
--- checkallpass
- math.randomseed(1)
- math.randomseed(0.75)
- math.randomseed('-1')
- math.randomseed('-0.25')
--- checkallerrors
- math.randomseed(nil) ...bad argument...
- math.randomseed('abc') ...bad argument...
- math.randomseed(true) ...bad argument...
- math.randomseed(<function>) ...bad argument...
- math.randomseed(<table>) ...bad argument...
- math.randomseed(<thread>) ...bad argument...
====== math.sin ======
--- checkallpass
- math.sin(1) 0.841...
- math.sin(0.75) 0.681...
- math.sin('-1') -0.84...
- math.sin('-0.25') -0.24...
--- checkallerrors
- math.sin(nil) ...bad argument...
- math.sin('abc') ...bad argument...
- math.sin(true) ...bad argument...
- math.sin(<function>) ...bad argument...
- math.sin(<table>) ...bad argument...
- math.sin(<thread>) ...bad argument...
====== math.sinh ======
--- checkallpass
- math.sinh(1) 1.175...
- math.sinh(0.75) 0.822...
- math.sinh('-1') -1.17...
- math.sinh('-0.25') -0.25...
--- checkallerrors
- math.sinh(nil) ...bad argument...
- math.sinh('abc') ...bad argument...
- math.sinh(true) ...bad argument...
- math.sinh(<function>) ...bad argument...
- math.sinh(<table>) ...bad argument...
- math.sinh(<thread>) ...bad argument...
====== math.tan ======
--- checkallpass
- math.tan(1) 1.557...
- math.tan(0.75) 0.931...
- math.tan('-1') -1.55...
- math.tan('-0.25') -0.25...
--- checkallerrors
- math.tan(nil) ...bad argument...
- math.tan('abc') ...bad argument...
- math.tan(true) ...bad argument...
- math.tan(<function>) ...bad argument...
- math.tan(<table>) ...bad argument...
- math.tan(<thread>) ...bad argument...
====== math.tanh ======
--- checkallpass
- math.tanh(1) 0.761...
- math.tanh(0.75) 0.635...
- math.tanh('-1') -0.76...
- math.tanh('-0.25') -0.24...
--- checkallerrors
- math.tanh(nil) ...bad argument...
- math.tanh('abc') ...bad argument...
- math.tanh(true) ...bad argument...
- math.tanh(<function>) ...bad argument...
- math.tanh(<table>) ...bad argument...
- math.tanh(<thread>) ...bad argument...
====== math.frexp ======
--- checkallpass
- math.frexp(1) 0.5,1
- math.frexp(0.75) 0.75,0
- math.frexp('-1') -0.5,1
- math.frexp('-0.25') -0.5,-1
--- checkallerrors
- math.frexp(nil) ...bad argument...
- math.frexp('abc') ...bad argument...
- math.frexp(true) ...bad argument...
- math.frexp(<function>) ...bad argument...
- math.frexp(<table>) ...bad argument...
- math.frexp(<thread>) ...bad argument...
====== math.log ======
--- checkallpass
- math.log(1) 0
- math.log(0.75) -0.28...
- math.log('2') 0.693...
- math.log('2.5') 0.916...
--- checkallerrors
- math.log(nil) ...bad argument...
- math.log('abc') ...bad argument...
- math.log(true) ...bad argument...
- math.log(<function>) ...bad argument...
- math.log(<table>) ...bad argument...
- math.log(<thread>) ...bad argument...
====== math.sqrt ======
--- checkallpass
- math.sqrt(1) 1
- math.sqrt(0.75) 0.866...
- math.sqrt('2') 1.414...
- math.sqrt('2.5') 1.581...
--- checkallerrors
- math.sqrt(nil) ...bad argument...
- math.sqrt('abc') ...bad argument...
- math.sqrt(true) ...bad argument...
- math.sqrt(<function>) ...bad argument...
- math.sqrt(<table>) ...bad argument...
- math.sqrt(<thread>) ...bad argument...
====== math.ceil ======
--- checkallpass
- math.ceil(1) 1
- math.ceil(0.75) 1
- math.ceil('2') 2
- math.ceil('2.5') 3
--- checkallerrors
- math.ceil(nil) ...bad argument...
- math.ceil('abc') ...bad argument...
- math.ceil(true) ...bad argument...
- math.ceil(<function>) ...bad argument...
- math.ceil(<table>) ...bad argument...
- math.ceil(<thread>) ...bad argument...
====== math.atan2 ======
--- checkallpass
- math.atan2(1,1) 0.785...
- math.atan2(0.75,1) 0.643...
- math.atan2('-1',1) -0.78...
- math.atan2('-0.25',1) -0.24...
- math.atan2(1,0.75) 0.927...
- math.atan2(0.75,0.75) 0.785...
- math.atan2('-1',0.75) -0.92...
- math.atan2('-0.25',0.75) -0.32...
- math.atan2(1,'-1') 2.356...
- math.atan2(0.75,'-1') 2.498...
- math.atan2('-1','-1') -2.35...
- math.atan2('-0.25','-1') -2.89...
- math.atan2(1,'-0.25') 1.815...
- math.atan2(0.75,'-0.25') 1.892...
- math.atan2('-1','-0.25') -1.81...
- math.atan2('-0.25','-0.25') -2.35...
--- checkallerrors
- math.atan2() ...bad argument...
--- checkallerrors
- math.atan2(nil) ...bad argument...
- math.atan2('abc') ...bad argument...
- math.atan2(true) ...bad argument...
- math.atan2(<function>) ...bad argument...
- math.atan2(<table>) ...bad argument...
- math.atan2(<thread>) ...bad argument...
--- checkallerrors
- math.atan2(nil,1) ...bad argument...
- math.atan2('abc',1) ...bad argument...
- math.atan2(true,1) ...bad argument...
- math.atan2(<function>,1) ...bad argument...
- math.atan2(<table>,1) ...bad argument...
- math.atan2(<thread>,1) ...bad argument...
- math.atan2(nil,0.75) ...bad argument...
- math.atan2('abc',0.75) ...bad argument...
- math.atan2(true,0.75) ...bad argument...
- math.atan2(<function>,0.75) ...bad argument...
- math.atan2(<table>,0.75) ...bad argument...
- math.atan2(<thread>,0.75) ...bad argument...
- math.atan2(nil,'-1') ...bad argument...
- math.atan2('abc','-1') ...bad argument...
- math.atan2(true,'-1') ...bad argument...
- math.atan2(<function>,'-1') ...bad argument...
- math.atan2(<table>,'-1') ...bad argument...
- math.atan2(<thread>,'-1') ...bad argument...
- math.atan2(nil,'-0.25') ...bad argument...
- math.atan2('abc','-0.25') ...bad argument...
- math.atan2(true,'-0.25') ...bad argument...
- math.atan2(<function>,'-0.25') ...bad argument...
- math.atan2(<table>,'-0.25') ...bad argument...
- math.atan2(<thread>,'-0.25') ...bad argument...
--- checkallerrors
- math.atan2(1) ...bad argument...
- math.atan2(0.75) ...bad argument...
- math.atan2('-1') ...bad argument...
- math.atan2('-0.25') ...bad argument...
--- checkallerrors
- math.atan2(1,nil) ...bad argument...
- math.atan2(0.75,nil) ...bad argument...
- math.atan2('-1',nil) ...bad argument...
- math.atan2('-0.25',nil) ...bad argument...
- math.atan2(1,'abc') ...bad argument...
- math.atan2(0.75,'abc') ...bad argument...
- math.atan2('-1','abc') ...bad argument...
- math.atan2('-0.25','abc') ...bad argument...
- math.atan2(1,true) ...bad argument...
- math.atan2(0.75,true) ...bad argument...
- math.atan2('-1',true) ...bad argument...
- math.atan2('-0.25',true) ...bad argument...
- math.atan2(1,<function>) ...bad argument...
- math.atan2(0.75,<function>) ...bad argument...
- math.atan2('-1',<function>) ...bad argument...
- math.atan2('-0.25',<function>) ...bad argument...
- math.atan2(1,<table>) ...bad argument...
- math.atan2(0.75,<table>) ...bad argument...
- math.atan2('-1',<table>) ...bad argument...
- math.atan2('-0.25',<table>) ...bad argument...
- math.atan2(1,<thread>) ...bad argument...
- math.atan2(0.75,<thread>) ...bad argument...
- math.atan2('-1',<thread>) ...bad argument...
- math.atan2('-0.25',<thread>) ...bad argument...
====== math.pow ======
--- checkallpass
- math.pow(1,1) 1
- math.pow(0.75,1) 0.75
- math.pow('2',1) 2
- math.pow('2.5',1) 2.5
- math.pow(1,0.75) 1
- math.pow(0.75,0.75) 0.805...
- math.pow('2',0.75) 1.681...
- math.pow('2.5',0.75) 1.988...
- math.pow(1,'-1') 1
- math.pow(0.75,'-1') 1.333...
- math.pow('2','-1') 0.5
- math.pow('2.5','-1') 0.4
- math.pow(1,'-0.25') 1
- math.pow(0.75,'-0.25') 1.074...
- math.pow('2','-0.25') 0.840...
- math.pow('2.5','-0.25') 0.795...
--- checkallerrors
- math.pow() ...bad argument...
--- checkallerrors
- math.pow(nil) ...bad argument...
- math.pow('abc') ...bad argument...
- math.pow(true) ...bad argument...
- math.pow(<function>) ...bad argument...
- math.pow(<table>) ...bad argument...
- math.pow(<thread>) ...bad argument...
--- checkallerrors
- math.pow(nil,1) ...bad argument...
- math.pow('abc',1) ...bad argument...
- math.pow(true,1) ...bad argument...
- math.pow(<function>,1) ...bad argument...
- math.pow(<table>,1) ...bad argument...
- math.pow(<thread>,1) ...bad argument...
- math.pow(nil,0.75) ...bad argument...
- math.pow('abc',0.75) ...bad argument...
- math.pow(true,0.75) ...bad argument...
- math.pow(<function>,0.75) ...bad argument...
- math.pow(<table>,0.75) ...bad argument...
- math.pow(<thread>,0.75) ...bad argument...
- math.pow(nil,'-1') ...bad argument...
- math.pow('abc','-1') ...bad argument...
- math.pow(true,'-1') ...bad argument...
- math.pow(<function>,'-1') ...bad argument...
- math.pow(<table>,'-1') ...bad argument...
- math.pow(<thread>,'-1') ...bad argument...
- math.pow(nil,'-0.25') ...bad argument...
- math.pow('abc','-0.25') ...bad argument...
- math.pow(true,'-0.25') ...bad argument...
- math.pow(<function>,'-0.25') ...bad argument...
- math.pow(<table>,'-0.25') ...bad argument...
- math.pow(<thread>,'-0.25') ...bad argument...
--- checkallerrors
- math.pow(1) ...bad argument...
- math.pow(0.75) ...bad argument...
- math.pow('-1') ...bad argument...
- math.pow('-0.25') ...bad argument...
--- checkallerrors
- math.pow(1,nil) ...bad argument...
- math.pow(0.75,nil) ...bad argument...
- math.pow('-1',nil) ...bad argument...
- math.pow('-0.25',nil) ...bad argument...
- math.pow(1,'abc') ...bad argument...
- math.pow(0.75,'abc') ...bad argument...
- math.pow('-1','abc') ...bad argument...
- math.pow('-0.25','abc') ...bad argument...
- math.pow(1,true) ...bad argument...
- math.pow(0.75,true) ...bad argument...
- math.pow('-1',true) ...bad argument...
- math.pow('-0.25',true) ...bad argument...
- math.pow(1,<function>) ...bad argument...
- math.pow(0.75,<function>) ...bad argument...
- math.pow('-1',<function>) ...bad argument...
- math.pow('-0.25',<function>) ...bad argument...
- math.pow(1,<table>) ...bad argument...
- math.pow(0.75,<table>) ...bad argument...
- math.pow('-1',<table>) ...bad argument...
- math.pow('-0.25',<table>) ...bad argument...
- math.pow(1,<thread>) ...bad argument...
- math.pow(0.75,<thread>) ...bad argument...
- math.pow('-1',<thread>) ...bad argument...
- math.pow('-0.25',<thread>) ...bad argument...
====== math.fmod ======
--- checkallpass
- math.fmod(1,1) 0
- math.fmod(0.75,1) 0.75
- math.fmod('2',1) 0
- math.fmod('2.5',1) 0.5
- math.fmod(1,0.75) 0.25
- math.fmod(0.75,0.75) 0
- math.fmod('2',0.75) 0.5
- math.fmod('2.5',0.75) 0.25
- math.fmod(1,'-1') 0
- math.fmod(0.75,'-1') 0.75
- math.fmod('2','-1') 0
- math.fmod('2.5','-1') 0.5
- math.fmod(1,'-0.25') 0
- math.fmod(0.75,'-0.25') 0
- math.fmod('2','-0.25') 0
- math.fmod('2.5','-0.25') 0
--- checkallerrors
- math.fmod() ...bad argument...
--- checkallerrors
- math.fmod(nil) ...bad argument...
- math.fmod('abc') ...bad argument...
- math.fmod(true) ...bad argument...
- math.fmod(<function>) ...bad argument...
- math.fmod(<table>) ...bad argument...
- math.fmod(<thread>) ...bad argument...
--- checkallerrors
- math.fmod(nil,1) ...bad argument...
- math.fmod('abc',1) ...bad argument...
- math.fmod(true,1) ...bad argument...
- math.fmod(<function>,1) ...bad argument...
- math.fmod(<table>,1) ...bad argument...
- math.fmod(<thread>,1) ...bad argument...
- math.fmod(nil,0.75) ...bad argument...
- math.fmod('abc',0.75) ...bad argument...
- math.fmod(true,0.75) ...bad argument...
- math.fmod(<function>,0.75) ...bad argument...
- math.fmod(<table>,0.75) ...bad argument...
- math.fmod(<thread>,0.75) ...bad argument...
- math.fmod(nil,'-1') ...bad argument...
- math.fmod('abc','-1') ...bad argument...
- math.fmod(true,'-1') ...bad argument...
- math.fmod(<function>,'-1') ...bad argument...
- math.fmod(<table>,'-1') ...bad argument...
- math.fmod(<thread>,'-1') ...bad argument...
- math.fmod(nil,'-0.25') ...bad argument...
- math.fmod('abc','-0.25') ...bad argument...
- math.fmod(true,'-0.25') ...bad argument...
- math.fmod(<function>,'-0.25') ...bad argument...
- math.fmod(<table>,'-0.25') ...bad argument...
- math.fmod(<thread>,'-0.25') ...bad argument...
--- checkallerrors
- math.fmod(1) ...bad argument...
- math.fmod(0.75) ...bad argument...
- math.fmod('-1') ...bad argument...
- math.fmod('-0.25') ...bad argument...
--- checkallerrors
- math.fmod(1,nil) ...bad argument...
- math.fmod(0.75,nil) ...bad argument...
- math.fmod('-1',nil) ...bad argument...
- math.fmod('-0.25',nil) ...bad argument...
- math.fmod(1,'abc') ...bad argument...
- math.fmod(0.75,'abc') ...bad argument...
- math.fmod('-1','abc') ...bad argument...
- math.fmod('-0.25','abc') ...bad argument...
- math.fmod(1,true) ...bad argument...
- math.fmod(0.75,true) ...bad argument...
- math.fmod('-1',true) ...bad argument...
- math.fmod('-0.25',true) ...bad argument...
- math.fmod(1,<function>) ...bad argument...
- math.fmod(0.75,<function>) ...bad argument...
- math.fmod('-1',<function>) ...bad argument...
- math.fmod('-0.25',<function>) ...bad argument...
- math.fmod(1,<table>) ...bad argument...
- math.fmod(0.75,<table>) ...bad argument...
- math.fmod('-1',<table>) ...bad argument...
- math.fmod('-0.25',<table>) ...bad argument...
- math.fmod(1,<thread>) ...bad argument...
- math.fmod(0.75,<thread>) ...bad argument...
- math.fmod('-1',<thread>) ...bad argument...
- math.fmod('-0.25',<thread>) ...bad argument...
====== math.max ======
--- checkallpass
- math.max(1) 1
- math.max(0.75) 0.75
- math.max('-1') -1
- math.max('-0.25') -0.25...
--- checkallpass
- math.max(1,1) 1
- math.max(0.75,1) 1
- math.max('-1',1) 1
- math.max('-0.25',1) 1
- math.max(1,0.75) 1
- math.max(0.75,0.75) 0.75
- math.max('-1',0.75) 0.75
- math.max('-0.25',0.75) 0.75
- math.max(1,'-1') 1
- math.max(0.75,'-1') 0.75
- math.max('-1','-1') -1
- math.max('-0.25','-1') -0.25...
- math.max(1,'-0.25') 1
- math.max(0.75,'-0.25') 0.75
- math.max('-1','-0.25') -0.25...
- math.max('-0.25','-0.25') -0.25...
--- checkallerrors
- math.max() ...bad argument...
--- checkallerrors
- math.max('abc') ...bad argument...
- math.max(true) ...bad argument...
- math.max(<function>) ...bad argument...
- math.max(<table>) ...bad argument...
--- checkallerrors
- math.max(1,'abc') ...bad argument...
- math.max(0.75,'abc') ...bad argument...
- math.max('-1','abc') ...bad argument...
- math.max('-0.25','abc') ...bad argument...
- math.max(1,true) ...bad argument...
- math.max(0.75,true) ...bad argument...
- math.max('-1',true) ...bad argument...
- math.max('-0.25',true) ...bad argument...
- math.max(1,<function>) ...bad argument...
- math.max(0.75,<function>) ...bad argument...
- math.max('-1',<function>) ...bad argument...
- math.max('-0.25',<function>) ...bad argument...
- math.max(1,<table>) ...bad argument...
- math.max(0.75,<table>) ...bad argument...
- math.max('-1',<table>) ...bad argument...
- math.max('-0.25',<table>) ...bad argument...
====== math.min ======
--- checkallpass
- math.min(1) 1
- math.min(0.75) 0.75
- math.min('-1') -1
- math.min('-0.25') -0.25...
--- checkallpass
- math.min(1,1) 1
- math.min(0.75,1) 0.75
- math.min('-1',1) -1
- math.min('-0.25',1) -0.25...
- math.min(1,0.75) 0.75
- math.min(0.75,0.75) 0.75
- math.min('-1',0.75) -1
- math.min('-0.25',0.75) -0.25...
- math.min(1,'-1') -1
- math.min(0.75,'-1') -1
- math.min('-1','-1') -1
- math.min('-0.25','-1') -1
- math.min(1,'-0.25') -0.25...
- math.min(0.75,'-0.25') -0.25...
- math.min('-1','-0.25') -1
- math.min('-0.25','-0.25') -0.25...
--- checkallerrors
- math.min() ...bad argument...
--- checkallerrors
- math.min('abc') ...bad argument...
- math.min(true) ...bad argument...
- math.min(<function>) ...bad argument...
- math.min(<table>) ...bad argument...
--- checkallerrors
- math.min(1,'abc') ...bad argument...
- math.min(0.75,'abc') ...bad argument...
- math.min('-1','abc') ...bad argument...
- math.min('-0.25','abc') ...bad argument...
- math.min(1,true) ...bad argument...
- math.min(0.75,true) ...bad argument...
- math.min('-1',true) ...bad argument...
- math.min('-0.25',true) ...bad argument...
- math.min(1,<function>) ...bad argument...
- math.min(0.75,<function>) ...bad argument...
- math.min('-1',<function>) ...bad argument...
- math.min('-0.25',<function>) ...bad argument...
- math.min(1,<table>) ...bad argument...
- math.min(0.75,<table>) ...bad argument...
- math.min('-1',<table>) ...bad argument...
- math.min('-0.25',<table>) ...bad argument...
====== math.random ======
--- checkallpass
- math.random() number
--- checkallpass
- math.random(3) number
- math.random(4.5) number
- math.random('6.7') number
--- checkallpass
- math.random(3,8) number
- math.random(4.5,8) number
- math.random('6.7',8) number
- math.random(3,9.1) number
- math.random(4.5,9.1) number
- math.random('6.7',9.1) number
- math.random(3,'12.34') number
- math.random(4.5,'12.34') number
- math.random('6.7','12.34') number
--- checkallpass
- math.random(-4,-1) number
- math.random(-5.6,-1) number
- math.random('-7',-1) number
- math.random('-8.9',-1) number
- math.random(-4,100) number
- math.random(-5.6,100) number
- math.random('-7',100) number
- math.random('-8.9',100) number
- math.random(-4,23.45...) number
- math.random(-5.6,23.45...) number
- math.random('-7',23.45...) number
- math.random('-8.9',23.45...) number
- math.random(-4,'-1.23') number
- math.random(-5.6,'-1.23') number
- math.random('-7','-1.23') number
- math.random('-8.9','-1.23') number
--- checkallerrors
- math.random(-4) ...interval is empty...
- math.random(-5.6) ...interval is empty...
- math.random('-7') ...interval is empty...
- math.random('-8.9') ...interval is empty...
--- checkallerrors
- math.random(8,3) ...interval is empty...
- math.random(9.1,3) ...interval is empty...
- math.random('12.34',3) ...interval is empty...
- math.random(8,4.5) ...interval is empty...
- math.random(9.1,4.5) ...interval is empty...
- math.random('12.34',4.5) ...interval is empty...
- math.random(8,'6.7') ...interval is empty...
- math.random(9.1,'6.7') ...interval is empty...
- math.random('12.34','6.7') ...interval is empty...
--- checkallerrors
- math.random('abc',8) ...bad argument...
- math.random(true,8) ...bad argument...
- math.random(<table>,8) ...bad argument...
- math.random(<function>,8) ...bad argument...
- math.random('abc',9.1) ...bad argument...
- math.random(true,9.1) ...bad argument...
- math.random(<table>,9.1) ...bad argument...
- math.random(<function>,9.1) ...bad argument...
- math.random('abc','12.34') ...bad argument...
- math.random(true,'12.34') ...bad argument...
- math.random(<table>,'12.34') ...bad argument...
- math.random(<function>,'12.34') ...bad argument...
--- checkallerrors
- math.random(3,'abc') ...bad argument...
- math.random(4.5,'abc') ...bad argument...
- math.random('6.7','abc') ...bad argument...
- math.random(3,true) ...bad argument...
- math.random(4.5,true) ...bad argument...
- math.random('6.7',true) ...bad argument...
- math.random(3,<table>) ...bad argument...
- math.random(4.5,<table>) ...bad argument...
- math.random('6.7',<table>) ...bad argument...
- math.random(3,<function>) ...bad argument...
- math.random(4.5,<function>) ...bad argument...
- math.random('6.7',<function>) ...bad argument...
====== math.ldexp ======
--- checkallpass
- math.ldexp(1,-3) 0.125...
- math.ldexp(0.75,-3) 0.093...
- math.ldexp('-1',-3) -0.12...
- math.ldexp('-0.25',-3) -0.03...
- math.ldexp(1,0) 1
- math.ldexp(0.75,0) 0.75
- math.ldexp('-1',0) -1
- math.ldexp('-0.25',0) -0.25...
- math.ldexp(1,3) 8
- math.ldexp(0.75,3) 6
- math.ldexp('-1',3) -8
- math.ldexp('-0.25',3) -2
- math.ldexp(1,9.1) 512
- math.ldexp(0.75,9.1) 384
- math.ldexp('-1',9.1) -512
- math.ldexp('-0.25',9.1) -128
- math.ldexp(1,'12.34') 4096
- math.ldexp(0.75,'12.34') 3072
- math.ldexp('-1','12.34') -4096...
- math.ldexp('-0.25','12.34') -1024...
--- checkallerrors
- math.ldexp() ...bad argument...
--- checkallerrors
- math.ldexp(nil) ...bad argument...
- math.ldexp('abc') ...bad argument...
- math.ldexp(true) ...bad argument...
- math.ldexp(<function>) ...bad argument...
- math.ldexp(<table>) ...bad argument...
- math.ldexp(<thread>) ...bad argument...
--- checkallerrors
- math.ldexp(nil,-3) ...bad argument...
- math.ldexp('abc',-3) ...bad argument...
- math.ldexp(true,-3) ...bad argument...
- math.ldexp(<function>,-3) ...bad argument...
- math.ldexp(<table>,-3) ...bad argument...
- math.ldexp(<thread>,-3) ...bad argument...
- math.ldexp(nil,0) ...bad argument...
- math.ldexp('abc',0) ...bad argument...
- math.ldexp(true,0) ...bad argument...
- math.ldexp(<function>,0) ...bad argument...
- math.ldexp(<table>,0) ...bad argument...
- math.ldexp(<thread>,0) ...bad argument...
- math.ldexp(nil,3) ...bad argument...
- math.ldexp('abc',3) ...bad argument...
- math.ldexp(true,3) ...bad argument...
- math.ldexp(<function>,3) ...bad argument...
- math.ldexp(<table>,3) ...bad argument...
- math.ldexp(<thread>,3) ...bad argument...
- math.ldexp(nil,9.1) ...bad argument...
- math.ldexp('abc',9.1) ...bad argument...
- math.ldexp(true,9.1) ...bad argument...
- math.ldexp(<function>,9.1) ...bad argument...
- math.ldexp(<table>,9.1) ...bad argument...
- math.ldexp(<thread>,9.1) ...bad argument...
- math.ldexp(nil,'12.34') ...bad argument...
- math.ldexp('abc','12.34') ...bad argument...
- math.ldexp(true,'12.34') ...bad argument...
- math.ldexp(<function>,'12.34') ...bad argument...
- math.ldexp(<table>,'12.34') ...bad argument...
- math.ldexp(<thread>,'12.34') ...bad argument...
--- checkallerrors
- math.ldexp(1) ...bad argument...
- math.ldexp(0.75) ...bad argument...
- math.ldexp('-1') ...bad argument...
- math.ldexp('-0.25') ...bad argument...
--- checkallerrors
- math.ldexp(1,nil) ...bad argument...
- math.ldexp(0.75,nil) ...bad argument...
- math.ldexp('-1',nil) ...bad argument...
- math.ldexp('-0.25',nil) ...bad argument...
- math.ldexp(1,'abc') ...bad argument...
- math.ldexp(0.75,'abc') ...bad argument...
- math.ldexp('-1','abc') ...bad argument...
- math.ldexp('-0.25','abc') ...bad argument...
- math.ldexp(1,true) ...bad argument...
- math.ldexp(0.75,true) ...bad argument...
- math.ldexp('-1',true) ...bad argument...
- math.ldexp('-0.25',true) ...bad argument...
- math.ldexp(1,<table>) ...bad argument...
- math.ldexp(0.75,<table>) ...bad argument...
- math.ldexp('-1',<table>) ...bad argument...
- math.ldexp('-0.25',<table>) ...bad argument...
- math.ldexp(1,<function>) ...bad argument...
- math.ldexp(0.75,<function>) ...bad argument...
- math.ldexp('-1',<function>) ...bad argument...
- math.ldexp('-0.25',<function>) ...bad argument...

View File

@@ -0,0 +1,33 @@
====== require ======
--- checkallpass
- require('math') table
- require('coroutine') table
- require('package') table
- require('string') table
- require('table') table
--- checkallerrors
- require(1.25) ...not found...
--- checkallerrors
- require(nil) ...bad argument...
- require(true) ...bad argument...
- require(<function>) ...bad argument...
- require(<table>) ...bad argument...
====== package.loadlib ======
--- checkallpass
- package.loadlib('foo','bar') nil,string,string
--- checkallerrors
- package.loadlib(nil) ...bad argument...
- package.loadlib(true) ...bad argument...
- package.loadlib(<table>) ...bad argument...
- package.loadlib(<function>) ...bad argument...
- package.loadlib(<thread>) ...bad argument...
====== package.seeall ======
--- checkallpass
fail package.seeall(<table>) 'attempt to call a nil value'
--- checkallerrors
badmsg package.seeall(nil) template='bad argument' actual='attempt to call a nil value'
badmsg package.seeall('abc') template='bad argument' actual='attempt to call a nil value'
badmsg package.seeall(1.25) template='bad argument' actual='attempt to call a nil value'
badmsg package.seeall(true) template='bad argument' actual='attempt to call a nil value'
badmsg package.seeall(<function>) template='bad argument' actual='attempt to call a nil value'
badmsg package.seeall(<thread>) template='bad argument' actual='attempt to call a nil value'

View File

@@ -0,0 +1,837 @@
====== unary - ======
--- checkallpass
- negative(1.25) -1.25
- negative('789') -789
--- checkallerrors
- negative(nil) ...attempt to perform arithmetic...
- negative('abc') ...attempt to perform arithmetic...
- negative(true) ...attempt to perform arithmetic...
- negative(<table>) ...attempt to perform arithmetic...
- negative(<function>) ...attempt to perform arithmetic...
- negative(<thread>) ...attempt to perform arithmetic...
====== # ======
--- checkallpass
- lengthop(<table>) 0
--- checkallerrors
- lengthop(nil) ...attempt to get length of...
needcheck lengthop('abc') 3
- lengthop(1.25) ...attempt to get length of...
- lengthop(true) ...attempt to get length of...
- lengthop(<function>) ...attempt to get length of...
- lengthop(<thread>) ...attempt to get length of...
====== not ======
--- checkallpass
- notop(1.25) false
- notop('789') false
--- checkallpass
- notop(nil) true
- notop('abc') false
- notop(true) false
- notop(<table>) false
- notop(<function>) false
- notop(<thread>) false
====== () ======
--- checkallpass
- funcop(<function>)
--- checkallerrors
- funcop(nil) ...attempt to call...
- funcop('abc') ...attempt to call...
- funcop(1.25) ...attempt to call...
- funcop(true) ...attempt to call...
- funcop(<table>) ...attempt to call...
- funcop(<thread>) ...attempt to call...
====== .. ======
--- checkallpass
- concatop('abc','abc') 'abcabc'
- concatop(1.25,'abc') '1.25abc'
- concatop('abc',1.25) 'abc1.25'
- concatop(1.25,1.25) '1.251.25'
--- checkallerrors
- concatop(nil,'abc') ...attempt to concatenate...
- concatop(true,'abc') ...attempt to concatenate...
- concatop(<table>,'abc') ...attempt to concatenate...
- concatop(<function>,'abc') ...attempt to concatenate...
- concatop(<thread>,'abc') ...attempt to concatenate...
- concatop(nil,1.25) ...attempt to concatenate...
- concatop(true,1.25) ...attempt to concatenate...
- concatop(<table>,1.25) ...attempt to concatenate...
- concatop(<function>,1.25) ...attempt to concatenate...
- concatop(<thread>,1.25) ...attempt to concatenate...
--- checkallerrors
- concatop('abc',nil) ...attempt to concatenate...
- concatop(1.25,nil) ...attempt to concatenate...
- concatop('abc',true) ...attempt to concatenate...
- concatop(1.25,true) ...attempt to concatenate...
- concatop('abc',<table>) ...attempt to concatenate...
- concatop(1.25,<table>) ...attempt to concatenate...
- concatop('abc',<function>) ...attempt to concatenate...
- concatop(1.25,<function>) ...attempt to concatenate...
- concatop('abc',<thread>) ...attempt to concatenate...
- concatop(1.25,<thread>) ...attempt to concatenate...
====== + ======
--- checkallpass
- plusop(1.25,1.25) 2.5
- plusop('789',1.25) 790.25
- plusop(1.25,'789') 790.25
- plusop('789','789') 1578
--- checkallerrors
- plusop(nil,1.25) ...attempt to perform arithmetic...
- plusop('abc',1.25) ...attempt to perform arithmetic...
- plusop(true,1.25) ...attempt to perform arithmetic...
- plusop(<table>,1.25) ...attempt to perform arithmetic...
- plusop(<function>,1.25) ...attempt to perform arithmetic...
- plusop(<thread>,1.25) ...attempt to perform arithmetic...
- plusop(nil,'789') ...attempt to perform arithmetic...
- plusop('abc','789') ...attempt to perform arithmetic...
- plusop(true,'789') ...attempt to perform arithmetic...
- plusop(<table>,'789') ...attempt to perform arithmetic...
- plusop(<function>,'789') ...attempt to perform arithmetic...
- plusop(<thread>,'789') ...attempt to perform arithmetic...
--- checkallerrors
- plusop(1.25,nil) ...attempt to perform arithmetic...
- plusop('789',nil) ...attempt to perform arithmetic...
- plusop(1.25,'abc') ...attempt to perform arithmetic...
- plusop('789','abc') ...attempt to perform arithmetic...
- plusop(1.25,true) ...attempt to perform arithmetic...
- plusop('789',true) ...attempt to perform arithmetic...
- plusop(1.25,<table>) ...attempt to perform arithmetic...
- plusop('789',<table>) ...attempt to perform arithmetic...
- plusop(1.25,<function>) ...attempt to perform arithmetic...
- plusop('789',<function>) ...attempt to perform arithmetic...
- plusop(1.25,<thread>) ...attempt to perform arithmetic...
- plusop('789',<thread>) ...attempt to perform arithmetic...
====== - ======
--- checkallpass
- minusop(1.25,1.25) 0
- minusop('789',1.25) 787.75
- minusop(1.25,'789') -787.75
- minusop('789','789') 0
--- checkallerrors
- minusop(nil,1.25) ...attempt to perform arithmetic...
- minusop('abc',1.25) ...attempt to perform arithmetic...
- minusop(true,1.25) ...attempt to perform arithmetic...
- minusop(<table>,1.25) ...attempt to perform arithmetic...
- minusop(<function>,1.25) ...attempt to perform arithmetic...
- minusop(<thread>,1.25) ...attempt to perform arithmetic...
- minusop(nil,'789') ...attempt to perform arithmetic...
- minusop('abc','789') ...attempt to perform arithmetic...
- minusop(true,'789') ...attempt to perform arithmetic...
- minusop(<table>,'789') ...attempt to perform arithmetic...
- minusop(<function>,'789') ...attempt to perform arithmetic...
- minusop(<thread>,'789') ...attempt to perform arithmetic...
--- checkallerrors
- minusop(1.25,nil) ...attempt to perform arithmetic...
- minusop('789',nil) ...attempt to perform arithmetic...
- minusop(1.25,'abc') ...attempt to perform arithmetic...
- minusop('789','abc') ...attempt to perform arithmetic...
- minusop(1.25,true) ...attempt to perform arithmetic...
- minusop('789',true) ...attempt to perform arithmetic...
- minusop(1.25,<table>) ...attempt to perform arithmetic...
- minusop('789',<table>) ...attempt to perform arithmetic...
- minusop(1.25,<function>) ...attempt to perform arithmetic...
- minusop('789',<function>) ...attempt to perform arithmetic...
- minusop(1.25,<thread>) ...attempt to perform arithmetic...
- minusop('789',<thread>) ...attempt to perform arithmetic...
====== * ======
--- checkallpass
- timesop(1.25,1.25) 1.5625
- timesop('789',1.25) 986.25
- timesop(1.25,'789') 986.25
- timesop('789','789') 622521
--- checkallerrors
- timesop(nil,1.25) ...attempt to perform arithmetic...
- timesop('abc',1.25) ...attempt to perform arithmetic...
- timesop(true,1.25) ...attempt to perform arithmetic...
- timesop(<table>,1.25) ...attempt to perform arithmetic...
- timesop(<function>,1.25) ...attempt to perform arithmetic...
- timesop(<thread>,1.25) ...attempt to perform arithmetic...
- timesop(nil,'789') ...attempt to perform arithmetic...
- timesop('abc','789') ...attempt to perform arithmetic...
- timesop(true,'789') ...attempt to perform arithmetic...
- timesop(<table>,'789') ...attempt to perform arithmetic...
- timesop(<function>,'789') ...attempt to perform arithmetic...
- timesop(<thread>,'789') ...attempt to perform arithmetic...
--- checkallerrors
- timesop(1.25,nil) ...attempt to perform arithmetic...
- timesop('789',nil) ...attempt to perform arithmetic...
- timesop(1.25,'abc') ...attempt to perform arithmetic...
- timesop('789','abc') ...attempt to perform arithmetic...
- timesop(1.25,true) ...attempt to perform arithmetic...
- timesop('789',true) ...attempt to perform arithmetic...
- timesop(1.25,<table>) ...attempt to perform arithmetic...
- timesop('789',<table>) ...attempt to perform arithmetic...
- timesop(1.25,<function>) ...attempt to perform arithmetic...
- timesop('789',<function>) ...attempt to perform arithmetic...
- timesop(1.25,<thread>) ...attempt to perform arithmetic...
- timesop('789',<thread>) ...attempt to perform arithmetic...
====== / ======
--- checkallpass
- divideop(1.25,1.25) 1
- divideop('789',1.25) 631.2
- divideop(1.25,'789') 0.001584...
- divideop('789','789') 1
--- checkallerrors
- divideop(nil,1.25) ...attempt to perform arithmetic...
- divideop('abc',1.25) ...attempt to perform arithmetic...
- divideop(true,1.25) ...attempt to perform arithmetic...
- divideop(<table>,1.25) ...attempt to perform arithmetic...
- divideop(<function>,1.25) ...attempt to perform arithmetic...
- divideop(<thread>,1.25) ...attempt to perform arithmetic...
- divideop(nil,'789') ...attempt to perform arithmetic...
- divideop('abc','789') ...attempt to perform arithmetic...
- divideop(true,'789') ...attempt to perform arithmetic...
- divideop(<table>,'789') ...attempt to perform arithmetic...
- divideop(<function>,'789') ...attempt to perform arithmetic...
- divideop(<thread>,'789') ...attempt to perform arithmetic...
--- checkallerrors
- divideop(1.25,nil) ...attempt to perform arithmetic...
- divideop('789',nil) ...attempt to perform arithmetic...
- divideop(1.25,'abc') ...attempt to perform arithmetic...
- divideop('789','abc') ...attempt to perform arithmetic...
- divideop(1.25,true) ...attempt to perform arithmetic...
- divideop('789',true) ...attempt to perform arithmetic...
- divideop(1.25,<table>) ...attempt to perform arithmetic...
- divideop('789',<table>) ...attempt to perform arithmetic...
- divideop(1.25,<function>) ...attempt to perform arithmetic...
- divideop('789',<function>) ...attempt to perform arithmetic...
- divideop(1.25,<thread>) ...attempt to perform arithmetic...
- divideop('789',<thread>) ...attempt to perform arithmetic...
====== % ======
--- checkallpass
- modop(1.25,1.25) 0
- modop('789',1.25) 0.25
- modop(1.25,'789') 1.25
- modop('789','789') 0
--- checkallerrors
- modop(nil,1.25) ...attempt to perform arithmetic...
- modop('abc',1.25) ...attempt to perform arithmetic...
- modop(true,1.25) ...attempt to perform arithmetic...
- modop(<table>,1.25) ...attempt to perform arithmetic...
- modop(<function>,1.25) ...attempt to perform arithmetic...
- modop(<thread>,1.25) ...attempt to perform arithmetic...
- modop(nil,'789') ...attempt to perform arithmetic...
- modop('abc','789') ...attempt to perform arithmetic...
- modop(true,'789') ...attempt to perform arithmetic...
- modop(<table>,'789') ...attempt to perform arithmetic...
- modop(<function>,'789') ...attempt to perform arithmetic...
- modop(<thread>,'789') ...attempt to perform arithmetic...
--- checkallerrors
- modop(1.25,nil) ...attempt to perform arithmetic...
- modop('789',nil) ...attempt to perform arithmetic...
- modop(1.25,'abc') ...attempt to perform arithmetic...
- modop('789','abc') ...attempt to perform arithmetic...
- modop(1.25,true) ...attempt to perform arithmetic...
- modop('789',true) ...attempt to perform arithmetic...
- modop(1.25,<table>) ...attempt to perform arithmetic...
- modop('789',<table>) ...attempt to perform arithmetic...
- modop(1.25,<function>) ...attempt to perform arithmetic...
- modop('789',<function>) ...attempt to perform arithmetic...
- modop(1.25,<thread>) ...attempt to perform arithmetic...
- modop('789',<thread>) ...attempt to perform arithmetic...
====== ^ ======
--- checkallpass
- powerop(2,3) 8
- powerop('2.5',3) 15.625
- powerop(2,'3.5') 11.31370...
- powerop('2.5','3.5') 24.70529...
--- checkallerrors
- powerop(nil,3) ...attempt to perform arithmetic...
- powerop('abc',3) ...attempt to perform arithmetic...
- powerop(true,3) ...attempt to perform arithmetic...
- powerop(<table>,3) ...attempt to perform arithmetic...
- powerop(<function>,3) ...attempt to perform arithmetic...
- powerop(<thread>,3) ...attempt to perform arithmetic...
- powerop(nil,'3.1') ...attempt to perform arithmetic...
- powerop('abc','3.1') ...attempt to perform arithmetic...
- powerop(true,'3.1') ...attempt to perform arithmetic...
- powerop(<table>,'3.1') ...attempt to perform arithmetic...
- powerop(<function>,'3.1') ...attempt to perform arithmetic...
- powerop(<thread>,'3.1') ...attempt to perform arithmetic...
--- checkallerrors
- powerop(2,nil) ...attempt to perform arithmetic...
- powerop('2.1',nil) ...attempt to perform arithmetic...
- powerop(2,'abc') ...attempt to perform arithmetic...
- powerop('2.1','abc') ...attempt to perform arithmetic...
- powerop(2,true) ...attempt to perform arithmetic...
- powerop('2.1',true) ...attempt to perform arithmetic...
- powerop(2,<table>) ...attempt to perform arithmetic...
- powerop('2.1',<table>) ...attempt to perform arithmetic...
- powerop(2,<function>) ...attempt to perform arithmetic...
- powerop('2.1',<function>) ...attempt to perform arithmetic...
- powerop(2,<thread>) ...attempt to perform arithmetic...
- powerop('2.1',<thread>) ...attempt to perform arithmetic...
====== == ======
--- checkallpass
- equalsop(nil,nil) true
- equalsop('abc',nil) false
- equalsop(1.25,nil) false
- equalsop(true,nil) false
- equalsop(<table>,nil) false
- equalsop(<function>,nil) false
- equalsop(<thread>,nil) false
- equalsop(nil,'abc') false
- equalsop('abc','abc') true
- equalsop(1.25,'abc') false
- equalsop(true,'abc') false
- equalsop(<table>,'abc') false
- equalsop(<function>,'abc') false
- equalsop(<thread>,'abc') false
- equalsop(nil,1.25) false
- equalsop('abc',1.25) false
- equalsop(1.25,1.25) true
- equalsop(true,1.25) false
- equalsop(<table>,1.25) false
- equalsop(<function>,1.25) false
- equalsop(<thread>,1.25) false
- equalsop(nil,true) false
- equalsop('abc',true) false
- equalsop(1.25,true) false
- equalsop(true,true) true
- equalsop(<table>,true) false
- equalsop(<function>,true) false
- equalsop(<thread>,true) false
- equalsop(nil,<table>) false
- equalsop('abc',<table>) false
- equalsop(1.25,<table>) false
- equalsop(true,<table>) false
- equalsop(<table>,<table>) true
- equalsop(<function>,<table>) false
- equalsop(<thread>,<table>) false
- equalsop(nil,<function>) false
- equalsop('abc',<function>) false
- equalsop(1.25,<function>) false
- equalsop(true,<function>) false
- equalsop(<table>,<function>) false
- equalsop(<function>,<function>) true
- equalsop(<thread>,<function>) false
- equalsop(nil,<thread>) false
- equalsop('abc',<thread>) false
- equalsop(1.25,<thread>) false
- equalsop(true,<thread>) false
- equalsop(<table>,<thread>) false
- equalsop(<function>,<thread>) false
- equalsop(<thread>,<thread>) true
====== ~= ======
--- checkallpass
- noteqop(nil,nil) false
- noteqop('abc',nil) true
- noteqop(1.25,nil) true
- noteqop(true,nil) true
- noteqop(<table>,nil) true
- noteqop(<function>,nil) true
- noteqop(<thread>,nil) true
- noteqop(nil,'abc') true
- noteqop('abc','abc') false
- noteqop(1.25,'abc') true
- noteqop(true,'abc') true
- noteqop(<table>,'abc') true
- noteqop(<function>,'abc') true
- noteqop(<thread>,'abc') true
- noteqop(nil,1.25) true
- noteqop('abc',1.25) true
- noteqop(1.25,1.25) false
- noteqop(true,1.25) true
- noteqop(<table>,1.25) true
- noteqop(<function>,1.25) true
- noteqop(<thread>,1.25) true
- noteqop(nil,true) true
- noteqop('abc',true) true
- noteqop(1.25,true) true
- noteqop(true,true) false
- noteqop(<table>,true) true
- noteqop(<function>,true) true
- noteqop(<thread>,true) true
- noteqop(nil,<table>) true
- noteqop('abc',<table>) true
- noteqop(1.25,<table>) true
- noteqop(true,<table>) true
- noteqop(<table>,<table>) false
- noteqop(<function>,<table>) true
- noteqop(<thread>,<table>) true
- noteqop(nil,<function>) true
- noteqop('abc',<function>) true
- noteqop(1.25,<function>) true
- noteqop(true,<function>) true
- noteqop(<table>,<function>) true
- noteqop(<function>,<function>) false
- noteqop(<thread>,<function>) true
- noteqop(nil,<thread>) true
- noteqop('abc',<thread>) true
- noteqop(1.25,<thread>) true
- noteqop(true,<thread>) true
- noteqop(<table>,<thread>) true
- noteqop(<function>,<thread>) true
- noteqop(<thread>,<thread>) false
====== <= ======
--- checkallpass
- leop(1.25,1.25) true
--- checkallpass
- leop('abc','abc') true
- leop('789','abc') true
- leop('abc','789') false
- leop('789','789') true
--- checkallerrors
- leop(nil,1.25) ...attempt to compare...
- leop('abc',1.25) ...attempt to compare...
- leop(true,1.25) ...attempt to compare...
- leop(<table>,1.25) ...attempt to compare...
- leop(<function>,1.25) ...attempt to compare...
- leop(<thread>,1.25) ...attempt to compare...
--- checkallerrors
- leop('789',1.25) ...attempt to compare...
--- checkallerrors
- leop(nil,'abc') ...attempt to compare...
- leop(true,'abc') ...attempt to compare...
- leop(<table>,'abc') ...attempt to compare...
- leop(<function>,'abc') ...attempt to compare...
- leop(<thread>,'abc') ...attempt to compare...
- leop(nil,'789') ...attempt to compare...
- leop(true,'789') ...attempt to compare...
- leop(<table>,'789') ...attempt to compare...
- leop(<function>,'789') ...attempt to compare...
- leop(<thread>,'789') ...attempt to compare...
--- checkallerrors
- leop(1.25,nil) ...attempt to compare...
- leop(1.25,'abc') ...attempt to compare...
- leop(1.25,true) ...attempt to compare...
- leop(1.25,<table>) ...attempt to compare...
- leop(1.25,<function>) ...attempt to compare...
- leop(1.25,<thread>) ...attempt to compare...
--- checkallerrors
- leop(1.25,'789') ...attempt to compare...
--- checkallerrors
- leop('abc',nil) ...attempt to compare...
- leop('789',nil) ...attempt to compare...
- leop('abc',true) ...attempt to compare...
- leop('789',true) ...attempt to compare...
- leop('abc',<table>) ...attempt to compare...
- leop('789',<table>) ...attempt to compare...
- leop('abc',<function>) ...attempt to compare...
- leop('789',<function>) ...attempt to compare...
- leop('abc',<thread>) ...attempt to compare...
- leop('789',<thread>) ...attempt to compare...
====== >= ======
--- checkallpass
- geop(1.25,1.25) true
--- checkallpass
- geop('abc','abc') true
- geop('789','abc') false
- geop('abc','789') true
- geop('789','789') true
--- checkallerrors
- geop(nil,1.25) ...attempt to compare...
- geop('abc',1.25) ...attempt to compare...
- geop(true,1.25) ...attempt to compare...
- geop(<table>,1.25) ...attempt to compare...
- geop(<function>,1.25) ...attempt to compare...
- geop(<thread>,1.25) ...attempt to compare...
--- checkallerrors
- geop('789',1.25) ...attempt to compare...
--- checkallerrors
- geop(nil,'abc') ...attempt to compare...
- geop(true,'abc') ...attempt to compare...
- geop(<table>,'abc') ...attempt to compare...
- geop(<function>,'abc') ...attempt to compare...
- geop(<thread>,'abc') ...attempt to compare...
- geop(nil,'789') ...attempt to compare...
- geop(true,'789') ...attempt to compare...
- geop(<table>,'789') ...attempt to compare...
- geop(<function>,'789') ...attempt to compare...
- geop(<thread>,'789') ...attempt to compare...
--- checkallerrors
- geop(1.25,nil) ...attempt to compare...
- geop(1.25,'abc') ...attempt to compare...
- geop(1.25,true) ...attempt to compare...
- geop(1.25,<table>) ...attempt to compare...
- geop(1.25,<function>) ...attempt to compare...
- geop(1.25,<thread>) ...attempt to compare...
--- checkallerrors
- geop(1.25,'789') ...attempt to compare...
--- checkallerrors
- geop('abc',nil) ...attempt to compare...
- geop('789',nil) ...attempt to compare...
- geop('abc',true) ...attempt to compare...
- geop('789',true) ...attempt to compare...
- geop('abc',<table>) ...attempt to compare...
- geop('789',<table>) ...attempt to compare...
- geop('abc',<function>) ...attempt to compare...
- geop('789',<function>) ...attempt to compare...
- geop('abc',<thread>) ...attempt to compare...
- geop('789',<thread>) ...attempt to compare...
====== < ======
--- checkallpass
- ltop(1.25,1.25) false
--- checkallpass
- ltop('abc','abc') false
- ltop('789','abc') true
- ltop('abc','789') false
- ltop('789','789') false
--- checkallerrors
- ltop(nil,1.25) ...attempt to compare...
- ltop('abc',1.25) ...attempt to compare...
- ltop(true,1.25) ...attempt to compare...
- ltop(<table>,1.25) ...attempt to compare...
- ltop(<function>,1.25) ...attempt to compare...
- ltop(<thread>,1.25) ...attempt to compare...
--- checkallerrors
- ltop('789',1.25) ...attempt to compare...
--- checkallerrors
- ltop(nil,'abc') ...attempt to compare...
- ltop(true,'abc') ...attempt to compare...
- ltop(<table>,'abc') ...attempt to compare...
- ltop(<function>,'abc') ...attempt to compare...
- ltop(<thread>,'abc') ...attempt to compare...
- ltop(nil,'789') ...attempt to compare...
- ltop(true,'789') ...attempt to compare...
- ltop(<table>,'789') ...attempt to compare...
- ltop(<function>,'789') ...attempt to compare...
- ltop(<thread>,'789') ...attempt to compare...
--- checkallerrors
- ltop(1.25,nil) ...attempt to compare...
- ltop(1.25,'abc') ...attempt to compare...
- ltop(1.25,true) ...attempt to compare...
- ltop(1.25,<table>) ...attempt to compare...
- ltop(1.25,<function>) ...attempt to compare...
- ltop(1.25,<thread>) ...attempt to compare...
--- checkallerrors
- ltop(1.25,'789') ...attempt to compare...
--- checkallerrors
- ltop('abc',nil) ...attempt to compare...
- ltop('789',nil) ...attempt to compare...
- ltop('abc',true) ...attempt to compare...
- ltop('789',true) ...attempt to compare...
- ltop('abc',<table>) ...attempt to compare...
- ltop('789',<table>) ...attempt to compare...
- ltop('abc',<function>) ...attempt to compare...
- ltop('789',<function>) ...attempt to compare...
- ltop('abc',<thread>) ...attempt to compare...
- ltop('789',<thread>) ...attempt to compare...
====== > ======
--- checkallpass
- gtop(1.25,1.25) false
--- checkallpass
- gtop('abc','abc') false
- gtop('789','abc') false
- gtop('abc','789') true
- gtop('789','789') false
--- checkallerrors
- gtop(nil,1.25) ...attempt to compare...
- gtop('abc',1.25) ...attempt to compare...
- gtop(true,1.25) ...attempt to compare...
- gtop(<table>,1.25) ...attempt to compare...
- gtop(<function>,1.25) ...attempt to compare...
- gtop(<thread>,1.25) ...attempt to compare...
--- checkallerrors
- gtop('789',1.25) ...attempt to compare...
--- checkallerrors
- gtop(nil,'abc') ...attempt to compare...
- gtop(true,'abc') ...attempt to compare...
- gtop(<table>,'abc') ...attempt to compare...
- gtop(<function>,'abc') ...attempt to compare...
- gtop(<thread>,'abc') ...attempt to compare...
- gtop(nil,'789') ...attempt to compare...
- gtop(true,'789') ...attempt to compare...
- gtop(<table>,'789') ...attempt to compare...
- gtop(<function>,'789') ...attempt to compare...
- gtop(<thread>,'789') ...attempt to compare...
--- checkallerrors
- gtop(1.25,nil) ...attempt to compare...
- gtop(1.25,'abc') ...attempt to compare...
- gtop(1.25,true) ...attempt to compare...
- gtop(1.25,<table>) ...attempt to compare...
- gtop(1.25,<function>) ...attempt to compare...
- gtop(1.25,<thread>) ...attempt to compare...
--- checkallerrors
- gtop(1.25,'789') ...attempt to compare...
--- checkallerrors
- gtop('abc',nil) ...attempt to compare...
- gtop('789',nil) ...attempt to compare...
- gtop('abc',true) ...attempt to compare...
- gtop('789',true) ...attempt to compare...
- gtop('abc',<table>) ...attempt to compare...
- gtop('789',<table>) ...attempt to compare...
- gtop('abc',<function>) ...attempt to compare...
- gtop('789',<function>) ...attempt to compare...
- gtop('abc',<thread>) ...attempt to compare...
- gtop('789',<thread>) ...attempt to compare...
====== [] ======
--- checkallpass
- bracketop(<table>,'abc')
- bracketop(<table>,1.25)
- bracketop(<table>,true)
- bracketop(<table>,<table>)
- bracketop(<table>,<function>)
- bracketop(<table>,<thread>)
--- checkallerrors
- bracketop(nil,'abc') ...attempt to index...
needcheck bracketop('abc','abc') nil
- bracketop(1.25,'abc') ...attempt to index...
- bracketop(true,'abc') ...attempt to index...
- bracketop(<function>,'abc') ...attempt to index...
- bracketop(<thread>,'abc') ...attempt to index...
- bracketop(nil,1.25) ...attempt to index...
needcheck bracketop('abc',1.25) nil
- bracketop(1.25,1.25) ...attempt to index...
- bracketop(true,1.25) ...attempt to index...
- bracketop(<function>,1.25) ...attempt to index...
- bracketop(<thread>,1.25) ...attempt to index...
- bracketop(nil,true) ...attempt to index...
needcheck bracketop('abc',true) nil
- bracketop(1.25,true) ...attempt to index...
- bracketop(true,true) ...attempt to index...
- bracketop(<function>,true) ...attempt to index...
- bracketop(<thread>,true) ...attempt to index...
- bracketop(nil,<table>) ...attempt to index...
needcheck bracketop('abc',<table>) nil
- bracketop(1.25,<table>) ...attempt to index...
- bracketop(true,<table>) ...attempt to index...
- bracketop(<function>,<table>) ...attempt to index...
- bracketop(<thread>,<table>) ...attempt to index...
- bracketop(nil,<function>) ...attempt to index...
needcheck bracketop('abc',<function>) nil
- bracketop(1.25,<function>) ...attempt to index...
- bracketop(true,<function>) ...attempt to index...
- bracketop(<function>,<function>) ...attempt to index...
- bracketop(<thread>,<function>) ...attempt to index...
- bracketop(nil,<thread>) ...attempt to index...
needcheck bracketop('abc',<thread>) nil
- bracketop(1.25,<thread>) ...attempt to index...
- bracketop(true,<thread>) ...attempt to index...
- bracketop(<function>,<thread>) ...attempt to index...
- bracketop(<thread>,<thread>) ...attempt to index...
--- checkallerrors
needcheck bracketop(<table>) nil
====== . ======
--- checkallpass
- dotop(<table>,'abc')
- dotop(<table>,1.25)
- dotop(<table>,true)
- dotop(<table>,<table>)
- dotop(<table>,<function>)
- dotop(<table>,<thread>)
--- checkallerrors
- dotop(nil,'abc') ...attempt to index...
needcheck dotop('abc','abc') nil
- dotop(1.25,'abc') ...attempt to index...
- dotop(true,'abc') ...attempt to index...
- dotop(<function>,'abc') ...attempt to index...
- dotop(<thread>,'abc') ...attempt to index...
- dotop(nil,1.25) ...attempt to index...
needcheck dotop('abc',1.25) nil
- dotop(1.25,1.25) ...attempt to index...
- dotop(true,1.25) ...attempt to index...
- dotop(<function>,1.25) ...attempt to index...
- dotop(<thread>,1.25) ...attempt to index...
- dotop(nil,true) ...attempt to index...
needcheck dotop('abc',true) nil
- dotop(1.25,true) ...attempt to index...
- dotop(true,true) ...attempt to index...
- dotop(<function>,true) ...attempt to index...
- dotop(<thread>,true) ...attempt to index...
- dotop(nil,<table>) ...attempt to index...
needcheck dotop('abc',<table>) nil
- dotop(1.25,<table>) ...attempt to index...
- dotop(true,<table>) ...attempt to index...
- dotop(<function>,<table>) ...attempt to index...
- dotop(<thread>,<table>) ...attempt to index...
- dotop(nil,<function>) ...attempt to index...
needcheck dotop('abc',<function>) nil
- dotop(1.25,<function>) ...attempt to index...
- dotop(true,<function>) ...attempt to index...
- dotop(<function>,<function>) ...attempt to index...
- dotop(<thread>,<function>) ...attempt to index...
- dotop(nil,<thread>) ...attempt to index...
needcheck dotop('abc',<thread>) nil
- dotop(1.25,<thread>) ...attempt to index...
- dotop(true,<thread>) ...attempt to index...
- dotop(<function>,<thread>) ...attempt to index...
- dotop(<thread>,<thread>) ...attempt to index...
--- checkallerrors
needcheck dotop(<table>) nil
====== and ======
--- checkallpass
- andop(nil,nil)
- andop('abc',nil)
- andop(1.25,nil)
- andop(true,nil)
- andop(<table>,nil)
- andop(<function>,nil)
- andop(<thread>,nil)
- andop(nil,'abc')
- andop('abc','abc') 'abc'
- andop(1.25,'abc') 'abc'
- andop(true,'abc') 'abc'
- andop(<table>,'abc') 'abc'
- andop(<function>,'abc') 'abc'
- andop(<thread>,'abc') 'abc'
- andop(nil,1.25)
- andop('abc',1.25) 1.25
- andop(1.25,1.25) 1.25
- andop(true,1.25) 1.25
- andop(<table>,1.25) 1.25
- andop(<function>,1.25) 1.25
- andop(<thread>,1.25) 1.25
- andop(nil,true)
- andop('abc',true) true
- andop(1.25,true) true
- andop(true,true) true
- andop(<table>,true) true
- andop(<function>,true) true
- andop(<thread>,true) true
- andop(nil,<table>)
- andop('abc',<table>) 'table'
- andop(1.25,<table>) 'table'
- andop(true,<table>) 'table'
- andop(<table>,<table>) 'table'
- andop(<function>,<table>) 'table'
- andop(<thread>,<table>) 'table'
- andop(nil,<function>)
- andop('abc',<function>) 'function'
- andop(1.25,<function>) 'function'
- andop(true,<function>) 'function'
- andop(<table>,<function>) 'function'
- andop(<function>,<function>) 'function'
- andop(<thread>,<function>) 'function'
- andop(nil,<thread>)
- andop('abc',<thread>) 'thread'
- andop(1.25,<thread>) 'thread'
- andop(true,<thread>) 'thread'
- andop(<table>,<thread>) 'thread'
- andop(<function>,<thread>) 'thread'
- andop(<thread>,<thread>) 'thread'
====== or ======
--- checkallpass
- orop(nil,nil)
- orop('abc',nil) 'abc'
- orop(1.25,nil) 1.25
- orop(true,nil) true
- orop(<table>,nil) 'table'
- orop(<function>,nil) 'function'
- orop(<thread>,nil) 'thread'
- orop(nil,'abc') 'abc'
- orop('abc','abc') 'abc'
- orop(1.25,'abc') 1.25
- orop(true,'abc') true
- orop(<table>,'abc') 'table'
- orop(<function>,'abc') 'function'
- orop(<thread>,'abc') 'thread'
- orop(nil,1.25) 1.25
- orop('abc',1.25) 'abc'
- orop(1.25,1.25) 1.25
- orop(true,1.25) true
- orop(<table>,1.25) 'table'
- orop(<function>,1.25) 'function'
- orop(<thread>,1.25) 'thread'
- orop(nil,true) true
- orop('abc',true) 'abc'
- orop(1.25,true) 1.25
- orop(true,true) true
- orop(<table>,true) 'table'
- orop(<function>,true) 'function'
- orop(<thread>,true) 'thread'
- orop(nil,<table>) 'table'
- orop('abc',<table>) 'abc'
- orop(1.25,<table>) 1.25
- orop(true,<table>) true
- orop(<table>,<table>) 'table'
- orop(<function>,<table>) 'function'
- orop(<thread>,<table>) 'thread'
- orop(nil,<function>) 'function'
- orop('abc',<function>) 'abc'
- orop(1.25,<function>) 1.25
- orop(true,<function>) true
- orop(<table>,<function>) 'table'
- orop(<function>,<function>) 'function'
- orop(<thread>,<function>) 'thread'
- orop(nil,<thread>) 'thread'
- orop('abc',<thread>) 'abc'
- orop(1.25,<thread>) 1.25
- orop(true,<thread>) true
- orop(<table>,<thread>) 'table'
- orop(<function>,<thread>) 'function'
- orop(<thread>,<thread>) 'thread'
====== for x=a,b,c ======
--- checkallpass
- forop(1,10,2)
- forop('1.1',10,2)
- forop(1,'10.1',2)
- forop('1.1','10.1',2)
- forop(1,10,'2.1')
- forop('1.1',10,'2.1')
- forop(1,'10.1','2.1')
- forop('1.1','10.1','2.1')
--- checkallerrors
- forop(nil,10,2) ...'for' initial value must be a number...
- forop('abc',10,2) ...'for' initial value must be a number...
- forop(true,10,2) ...'for' initial value must be a number...
- forop(<table>,10,2) ...'for' initial value must be a number...
- forop(<function>,10,2) ...'for' initial value must be a number...
- forop(<thread>,10,2) ...'for' initial value must be a number...
- forop(nil,'10.1',2) ...'for' initial value must be a number...
- forop('abc','10.1',2) ...'for' initial value must be a number...
- forop(true,'10.1',2) ...'for' initial value must be a number...
- forop(<table>,'10.1',2) ...'for' initial value must be a number...
- forop(<function>,'10.1',2) ...'for' initial value must be a number...
- forop(<thread>,'10.1',2) ...'for' initial value must be a number...
- forop(nil,10,'2.1') ...'for' initial value must be a number...
- forop('abc',10,'2.1') ...'for' initial value must be a number...
- forop(true,10,'2.1') ...'for' initial value must be a number...
- forop(<table>,10,'2.1') ...'for' initial value must be a number...
- forop(<function>,10,'2.1') ...'for' initial value must be a number...
- forop(<thread>,10,'2.1') ...'for' initial value must be a number...
- forop(nil,'10.1','2.1') ...'for' initial value must be a number...
- forop('abc','10.1','2.1') ...'for' initial value must be a number...
- forop(true,'10.1','2.1') ...'for' initial value must be a number...
- forop(<table>,'10.1','2.1') ...'for' initial value must be a number...
- forop(<function>,'10.1','2.1') ...'for' initial value must be a number...
- forop(<thread>,'10.1','2.1') ...'for' initial value must be a number...
--- checkallerrors
- forop(1,nil,2) ...'for' limit must be a number...
- forop('1.1',nil,2) ...'for' limit must be a number...
- forop(1,'abc',2) ...'for' limit must be a number...
- forop('1.1','abc',2) ...'for' limit must be a number...
- forop(1,true,2) ...'for' limit must be a number...
- forop('1.1',true,2) ...'for' limit must be a number...
- forop(1,<table>,2) ...'for' limit must be a number...
- forop('1.1',<table>,2) ...'for' limit must be a number...
- forop(1,<function>,2) ...'for' limit must be a number...
- forop('1.1',<function>,2) ...'for' limit must be a number...
- forop(1,<thread>,2) ...'for' limit must be a number...
- forop('1.1',<thread>,2) ...'for' limit must be a number...
- forop(1,nil,'2.1') ...'for' limit must be a number...
- forop('1.1',nil,'2.1') ...'for' limit must be a number...
- forop(1,'abc','2.1') ...'for' limit must be a number...
- forop('1.1','abc','2.1') ...'for' limit must be a number...
- forop(1,true,'2.1') ...'for' limit must be a number...
- forop('1.1',true,'2.1') ...'for' limit must be a number...
- forop(1,<table>,'2.1') ...'for' limit must be a number...
- forop('1.1',<table>,'2.1') ...'for' limit must be a number...
- forop(1,<function>,'2.1') ...'for' limit must be a number...
- forop('1.1',<function>,'2.1') ...'for' limit must be a number...
- forop(1,<thread>,'2.1') ...'for' limit must be a number...
- forop('1.1',<thread>,'2.1') ...'for' limit must be a number...
--- checkallerrors
- forop(1,10,nil) ...'for' step must be a number...
- forop('1.1',10,nil) ...'for' step must be a number...
- forop(1,'10.1',nil) ...'for' step must be a number...
- forop('1.1','10.1',nil) ...'for' step must be a number...
- forop(1,10,'abc') ...'for' step must be a number...
- forop('1.1',10,'abc') ...'for' step must be a number...
- forop(1,'10.1','abc') ...'for' step must be a number...
- forop('1.1','10.1','abc') ...'for' step must be a number...
- forop(1,10,true) ...'for' step must be a number...
- forop('1.1',10,true) ...'for' step must be a number...
- forop(1,'10.1',true) ...'for' step must be a number...
- forop('1.1','10.1',true) ...'for' step must be a number...
- forop(1,10,<table>) ...'for' step must be a number...
- forop('1.1',10,<table>) ...'for' step must be a number...
- forop(1,'10.1',<table>) ...'for' step must be a number...
- forop('1.1','10.1',<table>) ...'for' step must be a number...
- forop(1,10,<function>) ...'for' step must be a number...
- forop('1.1',10,<function>) ...'for' step must be a number...
- forop(1,'10.1',<function>) ...'for' step must be a number...
- forop('1.1','10.1',<function>) ...'for' step must be a number...
- forop(1,10,<thread>) ...'for' step must be a number...
- forop('1.1',10,<thread>) ...'for' step must be a number...
- forop(1,'10.1',<thread>) ...'for' step must be a number...
- forop('1.1','10.1',<thread>) ...'for' step must be a number...

Binary file not shown.

View File

@@ -0,0 +1,283 @@
====== table.concat ======
--- checkallpass
- table.concat(<table>) '87654321'
--- checkallpass
- table.concat(<table>,',') '8,7,6,5,4,3,2,1'
- table.concat(<table>,1.23) '81.2371.2361.2351.2341.2331.2321.231'
--- checkallpass
- table.concat(<table>,'-',2) '7-6-5-4-3-2-1'
- table.concat(<table>,'-','2') '7-6-5-4-3-2-1'
- table.concat(<table>,'-','2.2') '7-6-5-4-3-2-1'
--- checkallpass
- table.concat(<table>,'-',2,4) '7-6-5'
- table.concat(<table>,'-',2,'4') '7-6-5'
- table.concat(<table>,'-',2,'4.4') '7-6-5'
--- checkallerrors
- table.concat(nil) ...bad argument...
- table.concat('abc') ...bad argument...
- table.concat(1.25) ...bad argument...
- table.concat(true) ...bad argument...
- table.concat(<function>) ...bad argument...
- table.concat(<thread>) ...bad argument...
--- checkallerrors
- table.concat(<table>) ...boolean...
--- checkallerrors
- table.concat(<table>,true) ...bad argument...
- table.concat(<table>,<table>) ...bad argument...
- table.concat(<table>,<function>) ...bad argument...
--- checkallerrors
- table.concat(<table>,'-','abc') ...bad argument...
- table.concat(<table>,'-',true) ...bad argument...
- table.concat(<table>,'-',<table>) ...bad argument...
- table.concat(<table>,'-',<function>) ...bad argument...
--- checkallerrors
- table.concat(<table>,'-',2,'abc') ...bad argument...
- table.concat(<table>,'-',2,true) ...bad argument...
- table.concat(<table>,'-',2,<table>) ...bad argument...
- table.concat(<table>,'-',2,<function>) ...bad argument...
====== table.insert ======
--- checkallpass
- table.insert(<table>,'abc')
- table.insert(<table>,1.25)
- table.insert(<table>,true)
- table.insert(<table>,<table>)
- table.insert(<table>,<function>)
- table.insert(<table>,<thread>)
--- checkallpass
- table.insert(<table>,2,'abc')
- table.insert(<table>,'2','abc')
- table.insert(<table>,'2.2','abc')
- table.insert(<table>,2,1.25)
- table.insert(<table>,'2',1.25)
- table.insert(<table>,'2.2',1.25)
- table.insert(<table>,2,true)
- table.insert(<table>,'2',true)
- table.insert(<table>,'2.2',true)
- table.insert(<table>,2,<table>)
- table.insert(<table>,'2',<table>)
- table.insert(<table>,'2.2',<table>)
- table.insert(<table>,2,<function>)
- table.insert(<table>,'2',<function>)
- table.insert(<table>,'2.2',<function>)
- table.insert(<table>,2,<thread>)
- table.insert(<table>,'2',<thread>)
- table.insert(<table>,'2.2',<thread>)
--- checkallerrors
- table.insert(nil,'abc') ...bad argument...
- table.insert('abc','abc') ...bad argument...
- table.insert(1.25,'abc') ...bad argument...
- table.insert(true,'abc') ...bad argument...
- table.insert(<function>,'abc') ...bad argument...
- table.insert(<thread>,'abc') ...bad argument...
- table.insert(nil,1.25) ...bad argument...
- table.insert('abc',1.25) ...bad argument...
- table.insert(1.25,1.25) ...bad argument...
- table.insert(true,1.25) ...bad argument...
- table.insert(<function>,1.25) ...bad argument...
- table.insert(<thread>,1.25) ...bad argument...
--- checkallerrors
- table.insert(<table>,'abc','abc') ...bad argument...
- table.insert(<table>,true,'abc') ...bad argument...
- table.insert(<table>,<table>,'abc') ...bad argument...
- table.insert(<table>,<function>,'abc') ...bad argument...
- table.insert(<table>,'abc',1.25) ...bad argument...
- table.insert(<table>,true,1.25) ...bad argument...
- table.insert(<table>,<table>,1.25) ...bad argument...
- table.insert(<table>,<function>,1.25) ...bad argument...
- table.insert(<table>,'abc',true) ...bad argument...
- table.insert(<table>,true,true) ...bad argument...
- table.insert(<table>,<table>,true) ...bad argument...
- table.insert(<table>,<function>,true) ...bad argument...
- table.insert(<table>,'abc',<table>) ...bad argument...
- table.insert(<table>,true,<table>) ...bad argument...
- table.insert(<table>,<table>,<table>) ...bad argument...
- table.insert(<table>,<function>,<table>) ...bad argument...
- table.insert(<table>,'abc',<function>) ...bad argument...
- table.insert(<table>,true,<function>) ...bad argument...
- table.insert(<table>,<table>,<function>) ...bad argument...
- table.insert(<table>,<function>,<function>) ...bad argument...
- table.insert(<table>,'abc',<thread>) ...bad argument...
- table.insert(<table>,true,<thread>) ...bad argument...
- table.insert(<table>,<table>,<thread>) ...bad argument...
- table.insert(<table>,<function>,<thread>) ...bad argument...
====== table.remove ======
--- checkallpass
- table.remove(<table>) <thread>
--- checkallpass
- table.remove(<table>,2) <thread>
- table.remove(<table>,'2') <thread>
- table.remove(<table>,'2.2') <thread>
--- checkallerrors
- table.remove(nil) ...bad argument...
- table.remove('abc') ...bad argument...
- table.remove(1.25) ...bad argument...
- table.remove(true) ...bad argument...
- table.remove(<function>) ...bad argument...
- table.remove(<thread>) ...bad argument...
--- checkallerrors
- table.remove(nil,2) ...bad argument...
- table.remove('abc',2) ...bad argument...
- table.remove(1.25,2) ...bad argument...
- table.remove(true,2) ...bad argument...
- table.remove(<function>,2) ...bad argument...
- table.remove(<thread>,2) ...bad argument...
- table.remove(nil,'2') ...bad argument...
- table.remove('abc','2') ...bad argument...
- table.remove(1.25,'2') ...bad argument...
- table.remove(true,'2') ...bad argument...
- table.remove(<function>,'2') ...bad argument...
- table.remove(<thread>,'2') ...bad argument...
- table.remove(nil,'2.2') ...bad argument...
- table.remove('abc','2.2') ...bad argument...
- table.remove(1.25,'2.2') ...bad argument...
- table.remove(true,'2.2') ...bad argument...
- table.remove(<function>,'2.2') ...bad argument...
- table.remove(<thread>,'2.2') ...bad argument...
--- checkallerrors
- table.remove(<table>,'abc') ...bad argument...
- table.remove(<table>,true) ...bad argument...
- table.remove(<table>,<table>) ...bad argument...
- table.remove(<table>,<function>) ...bad argument...
====== table.sort ======
--- checkallpass
- table.sort(<table>,nil)
- table.sort(<table>,<function>)
--- checkallerrors
- table.sort(<table>) ...attempt to...
--- checkallerrors
- table.sort(nil,nil) ...bad argument...
- table.sort('abc',nil) ...bad argument...
- table.sort(1.25,nil) ...bad argument...
- table.sort(true,nil) ...bad argument...
- table.sort(<function>,nil) ...bad argument...
- table.sort(<thread>,nil) ...bad argument...
- table.sort(nil,<function>) ...bad argument...
- table.sort('abc',<function>) ...bad argument...
- table.sort(1.25,<function>) ...bad argument...
- table.sort(true,<function>) ...bad argument...
- table.sort(<function>,<function>) ...bad argument...
- table.sort(<thread>,<function>) ...bad argument...
--- checkallerrors
- table.sort(<table>,'abc') ...bad argument...
- table.sort(<table>,1.25) ...bad argument...
- table.sort(<table>,true) ...bad argument...
- table.sort(<table>,<table>) ...bad argument...
====== table_get - tbl[key] ======
--- checkallpass
- table_get(<table>,nil)
- table_get(<table>,'abc')
- table_get(<table>,1.25)
- table_get(<table>,true)
- table_get(<table>,<table>)
- table_get(<table>,<function>)
- table_get(<table>,<thread>)
====== table_set - tbl[key]=val ======
--- checkallpass
- table_set(<table>,'abc',nil)
- table_set(<table>,1.25,nil)
- table_set(<table>,true,nil)
- table_set(<table>,<table>,nil)
- table_set(<table>,<function>,nil)
- table_set(<table>,<thread>,nil)
- table_set(<table>,'abc','abc')
- table_set(<table>,1.25,'abc')
- table_set(<table>,true,'abc')
- table_set(<table>,<table>,'abc')
- table_set(<table>,<function>,'abc')
- table_set(<table>,<thread>,'abc')
- table_set(<table>,'abc',1.25)
- table_set(<table>,1.25,1.25)
- table_set(<table>,true,1.25)
- table_set(<table>,<table>,1.25)
- table_set(<table>,<function>,1.25)
- table_set(<table>,<thread>,1.25)
- table_set(<table>,'abc',true)
- table_set(<table>,1.25,true)
- table_set(<table>,true,true)
- table_set(<table>,<table>,true)
- table_set(<table>,<function>,true)
- table_set(<table>,<thread>,true)
- table_set(<table>,'abc',<table>)
- table_set(<table>,1.25,<table>)
- table_set(<table>,true,<table>)
- table_set(<table>,<table>,<table>)
- table_set(<table>,<function>,<table>)
- table_set(<table>,<thread>,<table>)
- table_set(<table>,'abc',<function>)
- table_set(<table>,1.25,<function>)
- table_set(<table>,true,<function>)
- table_set(<table>,<table>,<function>)
- table_set(<table>,<function>,<function>)
- table_set(<table>,<thread>,<function>)
- table_set(<table>,'abc',<thread>)
- table_set(<table>,1.25,<thread>)
- table_set(<table>,true,<thread>)
- table_set(<table>,<table>,<thread>)
- table_set(<table>,<function>,<thread>)
- table_set(<table>,<thread>,<thread>)
--- checkallerrors
- table_set_nil_key(<table>,nil) ...table index...
- table_set_nil_key(<table>,'abc') ...table index...
- table_set_nil_key(<table>,1.25) ...table index...
- table_set_nil_key(<table>,true) ...table index...
- table_set_nil_key(<table>,<table>) ...table index...
- table_set_nil_key(<table>,<function>) ...table index...
- table_set_nil_key(<table>,<thread>) ...table index...
====== table.unpack ======
--- checkallpass
- table.unpack(<table>) 'abc',<function>,<function>,<function>,<table>,<table>,<table>,true,true,true,1.25,1.25,1.25,'abc','abc','abc',1.25,true,<table>,<function>
--- checkallpass
- table.unpack(<table>,3) <function>,<function>,<table>,<table>,<table>,true,true,true,1.25,1.25,1.25,'abc','abc','abc',1.25,true,<table>,<function>
- table.unpack(<table>,'5') <table>,<table>,<table>,true,true,true,1.25,1.25,1.25,'abc','abc','abc',1.25,true,<table>,<function>
--- checkallpass
- table.unpack(<table>,3,1.25)
- table.unpack(<table>,'5',1.25)
- table.unpack(<table>,3,'7') <function>,<function>,<table>,<table>,<table>
- table.unpack(<table>,'5','7') <table>,<table>,<table>
--- checkallerrors
- table.unpack(nil,1.25,1.25) ...bad argument...
- table.unpack('abc',1.25,1.25) ...bad argument...
- table.unpack(1.25,1.25,1.25) ...bad argument...
- table.unpack(true,1.25,1.25) ...bad argument...
- table.unpack(<function>,1.25,1.25) ...bad argument...
- table.unpack(<thread>,1.25,1.25) ...bad argument...
- table.unpack(nil,'789',1.25) ...bad argument...
- table.unpack('abc','789',1.25) ...bad argument...
- table.unpack(1.25,'789',1.25) ...bad argument...
- table.unpack(true,'789',1.25) ...bad argument...
- table.unpack(<function>,'789',1.25) ...bad argument...
- table.unpack(<thread>,'789',1.25) ...bad argument...
- table.unpack(nil,1.25,'789') ...bad argument...
- table.unpack('abc',1.25,'789') ...bad argument...
- table.unpack(1.25,1.25,'789') ...bad argument...
- table.unpack(true,1.25,'789') ...bad argument...
- table.unpack(<function>,1.25,'789') ...bad argument...
- table.unpack(<thread>,1.25,'789') ...bad argument...
- table.unpack(nil,'789','789') ...bad argument...
- table.unpack('abc','789','789') ...bad argument...
- table.unpack(1.25,'789','789') ...bad argument...
- table.unpack(true,'789','789') ...bad argument...
- table.unpack(<function>,'789','789') ...bad argument...
- table.unpack(<thread>,'789','789') ...bad argument...
--- checkallerrors
- table.unpack(<table>,'abc',1.25) ...bad argument...
- table.unpack(<table>,true,1.25) ...bad argument...
- table.unpack(<table>,<table>,1.25) ...bad argument...
- table.unpack(<table>,<function>,1.25) ...bad argument...
- table.unpack(<table>,<thread>,1.25) ...bad argument...
- table.unpack(<table>,'abc','789') ...bad argument...
- table.unpack(<table>,true,'789') ...bad argument...
- table.unpack(<table>,<table>,'789') ...bad argument...
- table.unpack(<table>,<function>,'789') ...bad argument...
- table.unpack(<table>,<thread>,'789') ...bad argument...
--- checkallerrors
- table.unpack(<table>,1.25,'abc') ...bad argument...
- table.unpack(<table>,'789','abc') ...bad argument...
- table.unpack(<table>,1.25,true) ...bad argument...
- table.unpack(<table>,'789',true) ...bad argument...
- table.unpack(<table>,1.25,<table>) ...bad argument...
- table.unpack(<table>,'789',<table>) ...bad argument...
- table.unpack(<table>,1.25,<function>) ...bad argument...
- table.unpack(<table>,'789',<function>) ...bad argument...
- table.unpack(<table>,1.25,<thread>) ...bad argument...
- table.unpack(<table>,'789',<thread>) ...bad argument...

Binary file not shown.

View File

@@ -0,0 +1,236 @@
#!../lua
local version = "Lua 5.2"
if _VERSION ~= version then
io.stderr:write("\nThis test suite is for ", version, ", not for ", _VERSION,
"\nExiting tests\n")
return
end
-- next variables control the execution of some tests
-- true means no test (so an undefined variable does not skip a test)
-- defaults are for Linux; test everything
_soft = false -- true to avoid long or memory consuming tests
_port = false -- true to avoid non-portable tests
_no32 = false -- true to avoid tests that assume 32 bits
_nomsg = false -- true to avoid messages about tests not performed
_noposix = false -- false assumes LUA_USE_POSIX
_nolonglong = false -- false assumes LUA_USE_LONGLONG
_noformatA = false -- false assumes LUA_USE_AFORMAT
local usertests = rawget(_G, "_U")
if usertests then
-- tests for sissies ;) Avoid problems
_soft = true
_port = true
_no32 = true
_nomsg = true
_noposix = true
_nolonglong = true
_noformatA = true;
end
-- no "internal" tests for user tests
if usertests then T = nil end
T = rawget(_G, "T") -- avoid problems with 'strict' module
package.path = "?;./?.lua" .. package.path
math.randomseed(0)
collectgarbage("setstepmul", 200)
collectgarbage("setpause", 200)
--[=[
example of a long [comment],
[[spanning several [lines]]]
]=]
print("current path:\n****" .. package.path .. "****\n")
local c = os.clock()
local collectgarbage = collectgarbage
do
-- track messages for tests not performed
local msgs = {}
function Message (m)
if not _nomsg then
print(m)
msgs[#msgs+1] = string.sub(m, 3, -3)
end
end
assert(os.setlocale"C")
local T,print,format,write,assert,type,unpack,floor =
T,print,string.format,io.write,assert,type,table.unpack,math.floor
-- use K for 1000 and M for 1000000 (not 2^10 -- 2^20)
local function F (m)
local function round (m)
m = m + 0.04999
return m - (m % 0.1) -- keep one decimal digit
end
if m < 1000 then return m
else
m = m / 1000
if m < 1000 then return round(m).."K"
else
return round(m/1000).."M"
end
end
end
local showmem
if not T then
local max = 0
showmem = function ()
local m = collectgarbage("count") * 1024
max = (m > max) and m or max
print(format(" ---- total memory: %s, max memory: %s ----\n",
F(m), F(max)))
end
else
showmem = function ()
T.checkmemory()
local total, numblocks, maxmem = T.totalmem()
local count = collectgarbage("count")
print(format(
"\n ---- total memory: %s (%.0fK), max use: %s, blocks: %d\n",
F(total), count, F(maxmem), numblocks))
print(format("\t(strings: %d, tables: %d, functions: %d, "..
"\n\tudata: %d, threads: %d)",
T.totalmem"string", T.totalmem"table", T.totalmem"function",
T.totalmem"userdata", T.totalmem"thread"))
end
end
--
-- redefine dofile to run files through dump/undump
--
local function report (n) print("\n***** FILE '"..n.."'*****") end
local olddofile = dofile
dofile = function (n)
showmem()
report(n)
local f = assert(loadfile(n))
local b = string.dump(f)
f = assert(load(b))
return f()
end
dofile('main.lua')
do
local eph = setmetatable({}, {__mode = "k"}) -- create an ephemeron table
local next, setmetatable, stderr = next, setmetatable, io.stderr
local mt = {}
-- each time a table is collected, create a new one to be
-- collected next cycle
mt.__gc = function (o)
stderr:write'.' -- mark progress
-- assert(eph[o]() == o and next(eph) == o and next(eph, o) == nil)
local n = setmetatable({}, mt) -- replicate object
eph[n] = function () return n end
o = nil
local a,b,c,d,e = nil -- erase 'o' from the stack
end
local n = setmetatable({}, mt) -- replicate object
eph[n] = function () return n end
end
report"gc.lua"
local f = assert(loadfile('gc.lua'))
f()
collectgarbage("generational")
dofile('db.lua')
assert(dofile('calls.lua') == deep and deep)
olddofile('strings.lua')
olddofile('literals.lua')
assert(dofile('attrib.lua') == 27)
collectgarbage("incremental") -- redo some tests in incremental mode
olddofile('strings.lua')
olddofile('literals.lua')
dofile('constructs.lua')
dofile('api.lua')
collectgarbage("generational") -- back to generational mode
collectgarbage("setpause", 200)
collectgarbage("setmajorinc", 500)
assert(dofile('locals.lua') == 5)
dofile('constructs.lua')
dofile('code.lua')
if not _G._soft then
report('big.lua')
local f = coroutine.wrap(assert(loadfile('big.lua')))
assert(f() == 'b')
assert(f() == 'a')
end
dofile('nextvar.lua')
dofile('pm.lua')
dofile('api.lua')
assert(dofile('events.lua') == 12)
dofile('vararg.lua')
dofile('closure.lua')
dofile('coroutine.lua')
dofile('goto.lua')
dofile('errors.lua')
dofile('math.lua')
dofile('sort.lua')
dofile('bitwise.lua')
assert(dofile('verybig.lua') == 10); collectgarbage()
dofile('files.lua')
if #msgs > 0 then
print("\ntests not performed:")
for i=1,#msgs do
print(msgs[i])
end
print()
end
print("final OK !!!")
local debug = require "debug"
debug.sethook(function (a) assert(type(a) == 'string') end, "cr")
-- to survive outside block
_G.showmem = showmem
end
local _G, showmem, print, format, clock =
_G, showmem, print, string.format, os.clock
-- erase (almost) all globals
print('cleaning all!!!!')
for n in pairs(_G) do
if not ({___Glob = 1, tostring = 1})[n] then
_G[n] = nil
end
end
collectgarbage()
collectgarbage()
collectgarbage()
collectgarbage()
collectgarbage()
collectgarbage();showmem()
print(format("\n\ntotal time: %.2f\n", clock()-c))

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -0,0 +1,420 @@
-- The tests for 'require' assume some specific directories and libraries;
-- better to avoid them in generic machines
if not _port then --[
print "testing require"
assert(require"string" == string)
assert(require"math" == math)
assert(require"table" == table)
assert(require"io" == io)
assert(require"os" == os)
assert(require"coroutine" == coroutine)
assert(type(package.path) == "string")
assert(type(package.cpath) == "string")
assert(type(package.loaded) == "table")
assert(type(package.preload) == "table")
assert(type(package.config) == "string")
print("package config: "..string.gsub(package.config, "\n", "|"))
do
-- create a path with 'max' templates,
-- each with 1-10 repetitions of '?'
local max = 2000
local t = {}
for i = 1,max do t[i] = string.rep("?", i%10 + 1) end
t[#t + 1] = ";" -- empty template
local path = table.concat(t, ";")
-- use that path in a search
local s, err = package.searchpath("xuxu", path)
-- search fails; check that message has an occurence of
-- '??????????' with ? replaced by xuxu and at least 'max' lines
assert(not s and
string.find(err, string.rep("xuxu", 10)) and
#string.gsub(err, "[^\n]", "") >= max)
-- path with one very long template
local path = string.rep("?", max)
local s, err = package.searchpath("xuxu", path)
assert(not s and string.find(err, string.rep('xuxu', max)))
end
do
local oldpath = package.path
package.path = {}
local s, err = pcall(require, "no-such-file")
assert(not s and string.find(err, "package.path"))
package.path = oldpath
end
print('+')
-- auxiliary directory with C modules and temporary files
local DIR = "libs/"
-- prepend DIR to a name
local function D (x) return DIR .. x end
local function createfiles (files, preextras, posextras)
for n,c in pairs(files) do
io.output(D(n))
io.write(string.format(preextras, n))
io.write(c)
io.write(string.format(posextras, n))
io.close(io.output())
end
end
function removefiles (files)
for n in pairs(files) do
os.remove(D(n))
end
end
local files = {
["names.lua"] = "do return {...} end\n",
["err.lua"] = "B = 15; a = a + 1;",
["A.lua"] = "",
["B.lua"] = "assert(...=='B');require 'A'",
["A.lc"] = "",
["A"] = "",
["L"] = "",
["XXxX"] = "",
["C.lua"] = "package.loaded[...] = 25; require'C'"
}
AA = nil
local extras = [[
NAME = '%s'
REQUIRED = ...
return AA]]
createfiles(files, "", extras)
-- testing explicit "dir" separator in 'searchpath'
assert(package.searchpath("C.lua", D"?", "", "") == D"C.lua")
assert(package.searchpath("C.lua", D"?", ".", ".") == D"C.lua")
assert(package.searchpath("--x-", D"?", "-", "X") == D"XXxX")
assert(package.searchpath("---xX", D"?", "---", "XX") == D"XXxX")
assert(package.searchpath(D"C.lua", "?", "/") == D"C.lua")
assert(package.searchpath(".\\C.lua", D"?", "\\") == D"./C.lua")
local oldpath = package.path
package.path = string.gsub("D/?.lua;D/?.lc;D/?;D/??x?;D/L", "D/", DIR)
local try = function (p, n, r)
NAME = nil
local rr = require(p)
assert(NAME == n)
assert(REQUIRED == p)
assert(rr == r)
end
a = require"names"
assert(a[1] == "names" and a[2] == D"names.lua")
_G.a = nil
assert(not pcall(require, "err"))
assert(B == 15)
assert(package.searchpath("C", package.path) == D"C.lua")
assert(require"C" == 25)
assert(require"C" == 25)
AA = nil
try('B', 'B.lua', true)
assert(package.loaded.B)
assert(require"B" == true)
assert(package.loaded.A)
assert(require"C" == 25)
package.loaded.A = nil
try('B', nil, true) -- should not reload package
try('A', 'A.lua', true)
package.loaded.A = nil
os.remove(D'A.lua')
AA = {}
try('A', 'A.lc', AA) -- now must find second option
assert(package.searchpath("A", package.path) == D"A.lc")
assert(require("A") == AA)
AA = false
try('K', 'L', false) -- default option
try('K', 'L', false) -- default option (should reload it)
assert(rawget(_G, "_REQUIREDNAME") == nil)
AA = "x"
try("X", "XXxX", AA)
removefiles(files)
-- testing require of sub-packages
local _G = _G
package.path = string.gsub("D/?.lua;D/?/init.lua", "D/", DIR)
files = {
["P1/init.lua"] = "AA = 10",
["P1/xuxu.lua"] = "AA = 20",
}
createfiles(files, "_ENV = {}\n", "\nreturn _ENV\n")
AA = 0
local m = assert(require"P1")
assert(AA == 0 and m.AA == 10)
assert(require"P1" == m)
assert(require"P1" == m)
assert(package.searchpath("P1.xuxu", package.path) == D"P1/xuxu.lua")
m.xuxu = assert(require"P1.xuxu")
assert(AA == 0 and m.xuxu.AA == 20)
assert(require"P1.xuxu" == m.xuxu)
assert(require"P1.xuxu" == m.xuxu)
assert(require"P1" == m and m.AA == 10)
removefiles(files)
package.path = ""
assert(not pcall(require, "file_does_not_exist"))
package.path = "??\0?"
assert(not pcall(require, "file_does_not_exist1"))
package.path = oldpath
-- check 'require' error message
local fname = "file_does_not_exist2"
local m, err = pcall(require, fname)
for t in string.gmatch(package.path..";"..package.cpath, "[^;]+") do
t = string.gsub(t, "?", fname)
assert(string.find(err, t, 1, true))
end
local function import(...)
local f = {...}
return function (m)
for i=1, #f do m[f[i]] = _G[f[i]] end
end
end
-- cannot change environment of a C function
assert(not pcall(module, 'XUXU'))
-- testing require of C libraries
local p = "" -- On Mac OS X, redefine this to "_"
-- check whether loadlib works in this system
local st, err, when = package.loadlib(D"lib1.so", "*")
if not st then
local f, err, when = package.loadlib("donotexist", p.."xuxu")
assert(not f and type(err) == "string" and when == "absent")
;(Message or print)('\a\n >>> cannot load dynamic library <<<\n\a')
print(err, when)
else
-- tests for loadlib
local f = assert(package.loadlib(D"lib1.so", p.."onefunction"))
local a, b = f(15, 25)
assert(a == 25 and b == 15)
f = assert(package.loadlib(D"lib1.so", p.."anotherfunc"))
assert(f(10, 20) == "1020\n")
-- check error messages
local f, err, when = package.loadlib(D"lib1.so", p.."xuxu")
assert(not f and type(err) == "string" and when == "init")
f, err, when = package.loadlib("donotexist", p.."xuxu")
assert(not f and type(err) == "string" and when == "open")
-- symbols from 'lib1' must be visible to other libraries
f = assert(package.loadlib(D"lib11.so", p.."luaopen_lib11"))
assert(f() == "exported")
-- test C modules with prefixes in names
package.cpath = D"?.so"
local lib2 = require"v-lib2"
-- check correct access to global environment and correct
-- parameters
assert(_ENV.x == "v-lib2" and _ENV.y == D"v-lib2.so")
assert(lib2.id("x") == "x")
-- test C submodules
local fs = require"lib1.sub"
assert(_ENV.x == "lib1.sub" and _ENV.y == D"lib1.so")
assert(fs.id(45) == 45)
end
_ENV = _G
-- testing preload
do
local p = package
package = {}
p.preload.pl = function (...)
local _ENV = {...}
function xuxu (x) return x+20 end
return _ENV
end
local pl = require"pl"
assert(require"pl" == pl)
assert(pl.xuxu(10) == 30)
assert(pl[1] == "pl" and pl[2] == nil)
package = p
assert(type(package.path) == "string")
end
print('+')
end --]
print("testing assignments, logical operators, and constructors")
local res, res2 = 27
a, b = 1, 2+3
assert(a==1 and b==5)
a={}
function f() return 10, 11, 12 end
a.x, b, a[1] = 1, 2, f()
assert(a.x==1 and b==2 and a[1]==10)
a[f()], b, a[f()+3] = f(), a, 'x'
assert(a[10] == 10 and b == a and a[13] == 'x')
do
local f = function (n) local x = {}; for i=1,n do x[i]=i end;
return table.unpack(x) end;
local a,b,c
a,b = 0, f(1)
assert(a == 0 and b == 1)
A,b = 0, f(1)
assert(A == 0 and b == 1)
a,b,c = 0,5,f(4)
assert(a==0 and b==5 and c==1)
a,b,c = 0,5,f(0)
assert(a==0 and b==5 and c==nil)
end
a, b, c, d = 1 and nil, 1 or nil, (1 and (nil or 1)), 6
assert(not a and b and c and d==6)
d = 20
a, b, c, d = f()
assert(a==10 and b==11 and c==12 and d==nil)
a,b = f(), 1, 2, 3, f()
assert(a==10 and b==1)
assert(a<b == false and a>b == true)
assert((10 and 2) == 2)
assert((10 or 2) == 10)
assert((10 or assert(nil)) == 10)
assert(not (nil and assert(nil)))
assert((nil or "alo") == "alo")
assert((nil and 10) == nil)
assert((false and 10) == false)
assert((true or 10) == true)
assert((false or 10) == 10)
assert(false ~= nil)
assert(nil ~= false)
assert(not nil == true)
assert(not not nil == false)
assert(not not 1 == true)
assert(not not a == true)
assert(not not (6 or nil) == true)
assert(not not (nil and 56) == false)
assert(not not (nil and true) == false)
assert({} ~= {})
print('+')
a = {}
a[true] = 20
a[false] = 10
assert(a[1<2] == 20 and a[1>2] == 10)
function f(a) return a end
local a = {}
for i=3000,-3000,-1 do a[i] = i; end
a[10e30] = "alo"; a[true] = 10; a[false] = 20
assert(a[10e30] == 'alo' and a[not 1] == 20 and a[10<20] == 10)
for i=3000,-3000,-1 do assert(a[i] == i); end
a[print] = assert
a[f] = print
a[a] = a
assert(a[a][a][a][a][print] == assert)
a[print](a[a[f]] == a[print])
assert(not pcall(function () a[nil] = 10 end))
assert(a[nil] == nil)
a = nil
a = {10,9,8,7,6,5,4,3,2; [-3]='a', [f]=print, a='a', b='ab'}
a, a.x, a.y = a, a[-3]
assert(a[1]==10 and a[-3]==a.a and a[f]==print and a.x=='a' and not a.y)
a[1], f(a)[2], b, c = {['alo']=assert}, 10, a[1], a[f], 6, 10, 23, f(a), 2
a[1].alo(a[2]==10 and b==10 and c==print)
a[2^31] = 10; a[2^31+1] = 11; a[-2^31] = 12;
a[2^32] = 13; a[-2^32] = 14; a[2^32+1] = 15; a[10^33] = 16;
assert(a[2^31] == 10 and a[2^31+1] == 11 and a[-2^31] == 12 and
a[2^32] == 13 and a[-2^32] == 14 and a[2^32+1] == 15 and
a[10^33] == 16)
a = nil
-- test conflicts in multiple assignment
do
local a,i,j,b
a = {'a', 'b'}; i=1; j=2; b=a
i, a[i], a, j, a[j], a[i+j] = j, i, i, b, j, i
assert(i == 2 and b[1] == 1 and a == 1 and j == b and b[2] == 2 and
b[3] == 1)
end
-- repeat test with upvalues
do
local a,i,j,b
a = {'a', 'b'}; i=1; j=2; b=a
local function foo ()
i, a[i], a, j, a[j], a[i+j] = j, i, i, b, j, i
end
foo()
assert(i == 2 and b[1] == 1 and a == 1 and j == b and b[2] == 2 and
b[3] == 1)
local t = {}
(function (a) t[a], a = 10, 20 end)(1);
assert(t[1] == 10)
end
-- bug in 5.2 beta
local function foo ()
local a
return function ()
local b
a, b = 3, 14 -- local and upvalue have same index
return a, b
end
end
local a, b = foo()()
assert(a == 3 and b == 14)
print('OK')
return res

Binary file not shown.

View File

@@ -0,0 +1,79 @@
if _soft then
return 'a'
end
print "testing large tables"
local debug = require"debug"
local lim = 2^18 + 1000
local prog = { "local y = {0" }
for i = 1, lim do prog[#prog + 1] = i end
prog[#prog + 1] = "}\n"
prog[#prog + 1] = "X = y\n"
prog[#prog + 1] = ("assert(X[%d] == %d)"):format(lim - 1, lim - 2)
prog[#prog + 1] = "return 0"
prog = table.concat(prog, ";")
local env = {string = string, assert = assert}
local f = assert(load(prog, nil, nil, env))
f()
assert(env.X[lim] == lim - 1 and env.X[lim + 1] == lim)
for k in pairs(env) do env[k] = nil end
-- yields during accesses larger than K (in RK)
setmetatable(env, {
__index = function (t, n) coroutine.yield('g'); return _G[n] end,
__newindex = function (t, n, v) coroutine.yield('s'); _G[n] = v end,
})
X = nil
co = coroutine.wrap(f)
assert(co() == 's')
assert(co() == 'g')
assert(co() == 'g')
assert(co() == 0)
assert(X[lim] == lim - 1 and X[lim + 1] == lim)
-- errors in accesses larger than K (in RK)
getmetatable(env).__index = function () end
getmetatable(env).__newindex = function () end
local e, m = pcall(f)
assert(not e and m:find("global 'X'"))
-- errors in metamethods
getmetatable(env).__newindex = function () error("hi") end
local e, m = xpcall(f, debug.traceback)
assert(not e and m:find("'__newindex'"))
f, X = nil
coroutine.yield'b'
if not _no32 then -- {
print "testing string length overflow"
local repstrings = 192 -- number of strings to be concatenated
local ssize = math.ceil(2^32 / repstrings) + 1 -- size of each string
assert(repstrings * ssize > 2^32) -- this should be larger than maximum size_t
local longs = string.rep("\0", ssize) -- create one long string
-- create function to concatentate 'repstrings' copies of its argument
local rep = assert(load(
"local a = ...; return " .. string.rep("a", repstrings, "..")))
local a, b = pcall(rep, longs) -- call that function
-- it should fail without creating string (result would be too large)
assert(not a and string.find(b, "overflow"))
end -- }
print'OK'
return 'a'

Binary file not shown.

View File

@@ -0,0 +1,115 @@
print("testing bitwise operations")
assert(bit32.band() == bit32.bnot(0))
assert(bit32.btest() == true)
assert(bit32.bor() == 0)
assert(bit32.bxor() == 0)
assert(bit32.band() == bit32.band(0xffffffff))
assert(bit32.band(1,2) == 0)
-- out-of-range numbers
assert(bit32.band(-1) == 0xffffffff)
assert(bit32.band(2^33 - 1) == 0xffffffff)
assert(bit32.band(-2^33 - 1) == 0xffffffff)
assert(bit32.band(2^33 + 1) == 1)
assert(bit32.band(-2^33 + 1) == 1)
assert(bit32.band(-2^40) == 0)
assert(bit32.band(2^40) == 0)
assert(bit32.band(-2^40 - 2) == 0xfffffffe)
assert(bit32.band(2^40 - 4) == 0xfffffffc)
assert(bit32.lrotate(0, -1) == 0)
assert(bit32.lrotate(0, 7) == 0)
assert(bit32.lrotate(0x12345678, 4) == 0x23456781)
assert(bit32.rrotate(0x12345678, -4) == 0x23456781)
assert(bit32.lrotate(0x12345678, -8) == 0x78123456)
assert(bit32.rrotate(0x12345678, 8) == 0x78123456)
assert(bit32.lrotate(0xaaaaaaaa, 2) == 0xaaaaaaaa)
assert(bit32.lrotate(0xaaaaaaaa, -2) == 0xaaaaaaaa)
for i = -50, 50 do
assert(bit32.lrotate(0x89abcdef, i) == bit32.lrotate(0x89abcdef, i%32))
end
assert(bit32.lshift(0x12345678, 4) == 0x23456780)
assert(bit32.lshift(0x12345678, 8) == 0x34567800)
assert(bit32.lshift(0x12345678, -4) == 0x01234567)
assert(bit32.lshift(0x12345678, -8) == 0x00123456)
assert(bit32.lshift(0x12345678, 32) == 0)
assert(bit32.lshift(0x12345678, -32) == 0)
assert(bit32.rshift(0x12345678, 4) == 0x01234567)
assert(bit32.rshift(0x12345678, 8) == 0x00123456)
assert(bit32.rshift(0x12345678, 32) == 0)
assert(bit32.rshift(0x12345678, -32) == 0)
assert(bit32.arshift(0x12345678, 0) == 0x12345678)
assert(bit32.arshift(0x12345678, 1) == 0x12345678 / 2)
assert(bit32.arshift(0x12345678, -1) == 0x12345678 * 2)
assert(bit32.arshift(-1, 1) == 0xffffffff)
assert(bit32.arshift(-1, 24) == 0xffffffff)
assert(bit32.arshift(-1, 32) == 0xffffffff)
assert(bit32.arshift(-1, -1) == (-1 * 2) % 2^32)
print("+")
-- some special cases
local c = {0, 1, 2, 3, 10, 0x80000000, 0xaaaaaaaa, 0x55555555,
0xffffffff, 0x7fffffff}
for _, b in pairs(c) do
assert(bit32.band(b) == b)
assert(bit32.band(b, b) == b)
assert(bit32.btest(b, b) == (b ~= 0))
assert(bit32.band(b, b, b) == b)
assert(bit32.btest(b, b, b) == (b ~= 0))
assert(bit32.band(b, bit32.bnot(b)) == 0)
assert(bit32.bor(b, bit32.bnot(b)) == bit32.bnot(0))
assert(bit32.bor(b) == b)
assert(bit32.bor(b, b) == b)
assert(bit32.bor(b, b, b) == b)
assert(bit32.bxor(b) == b)
assert(bit32.bxor(b, b) == 0)
assert(bit32.bxor(b, 0) == b)
assert(bit32.bnot(b) ~= b)
assert(bit32.bnot(bit32.bnot(b)) == b)
assert(bit32.bnot(b) == 2^32 - 1 - b)
assert(bit32.lrotate(b, 32) == b)
assert(bit32.rrotate(b, 32) == b)
assert(bit32.lshift(bit32.lshift(b, -4), 4) == bit32.band(b, bit32.bnot(0xf)))
assert(bit32.rshift(bit32.rshift(b, 4), -4) == bit32.band(b, bit32.bnot(0xf)))
for i = -40, 40 do
assert(bit32.lshift(b, i) == math.floor((b * 2^i) % 2^32))
end
end
assert(not pcall(bit32.band, {}))
assert(not pcall(bit32.bnot, "a"))
assert(not pcall(bit32.lshift, 45))
assert(not pcall(bit32.lshift, 45, print))
assert(not pcall(bit32.rshift, 45, print))
print("+")
-- testing extract/replace
assert(bit32.extract(0x12345678, 0, 4) == 8)
assert(bit32.extract(0x12345678, 4, 4) == 7)
assert(bit32.extract(0xa0001111, 28, 4) == 0xa)
assert(bit32.extract(0xa0001111, 31, 1) == 1)
assert(bit32.extract(0x50000111, 31, 1) == 0)
assert(bit32.extract(0xf2345679, 0, 32) == 0xf2345679)
assert(not pcall(bit32.extract, 0, -1))
assert(not pcall(bit32.extract, 0, 32))
assert(not pcall(bit32.extract, 0, 0, 33))
assert(not pcall(bit32.extract, 0, 31, 2))
assert(bit32.replace(0x12345678, 5, 28, 4) == 0x52345678)
assert(bit32.replace(0x12345678, 0x87654321, 0, 32) == 0x87654321)
assert(bit32.replace(0, 1, 2) == 2^2)
assert(bit32.replace(0, -1, 4) == 2^4)
assert(bit32.replace(-1, 0, 31) == 2^31 - 1)
assert(bit32.replace(-1, 0, 1, 2) == 2^32 - 7)
print'OK'

Binary file not shown.

View File

@@ -0,0 +1,305 @@
print("testing functions and calls")
local debug = require "debug"
-- get the opportunity to test 'type' too ;)
assert(type(1<2) == 'boolean')
assert(type(true) == 'boolean' and type(false) == 'boolean')
assert(type(nil) == 'nil' and type(-3) == 'number' and type'x' == 'string' and
type{} == 'table' and type(type) == 'function')
assert(type(assert) == type(print))
f = nil
function f (x) return a:x (x) end
assert(type(f) == 'function')
-- testing local-function recursion
fact = false
do
local res = 1
local function fact (n)
if n==0 then return res
else return n*fact(n-1)
end
end
assert(fact(5) == 120)
end
assert(fact == false)
-- testing declarations
a = {i = 10}
self = 20
function a:x (x) return x+self.i end
function a.y (x) return x+self end
assert(a:x(1)+10 == a.y(1))
a.t = {i=-100}
a["t"].x = function (self, a,b) return self.i+a+b end
assert(a.t:x(2,3) == -95)
do
local a = {x=0}
function a:add (x) self.x, a.y = self.x+x, 20; return self end
assert(a:add(10):add(20):add(30).x == 60 and a.y == 20)
end
local a = {b={c={}}}
function a.b.c.f1 (x) return x+1 end
function a.b.c:f2 (x,y) self[x] = y end
assert(a.b.c.f1(4) == 5)
a.b.c:f2('k', 12); assert(a.b.c.k == 12)
print('+')
t = nil -- 'declare' t
function f(a,b,c) local d = 'a'; t={a,b,c,d} end
f( -- this line change must be valid
1,2)
assert(t[1] == 1 and t[2] == 2 and t[3] == nil and t[4] == 'a')
f(1,2, -- this one too
3,4)
assert(t[1] == 1 and t[2] == 2 and t[3] == 3 and t[4] == 'a')
function fat(x)
if x <= 1 then return 1
else return x*load("return fat(" .. x-1 .. ")")()
end
end
assert(load "load 'assert(fat(6)==720)' () ")()
a = load('return fat(5), 3')
a,b = a()
assert(a == 120 and b == 3)
print('+')
function err_on_n (n)
if n==0 then error(); exit(1);
else err_on_n (n-1); exit(1);
end
end
do
function dummy (n)
if n > 0 then
assert(not pcall(err_on_n, n))
dummy(n-1)
end
end
end
dummy(10)
function deep (n)
if n>0 then deep(n-1) end
end
deep(10)
deep(200)
-- testing tail call
function deep (n) if n>0 then return deep(n-1) else return 101 end end
assert(deep(30000) == 101)
a = {}
function a:deep (n) if n>0 then return self:deep(n-1) else return 101 end end
assert(a:deep(30000) == 101)
print('+')
a = nil
(function (x) a=x end)(23)
assert(a == 23 and (function (x) return x*2 end)(20) == 40)
-- testing closures
-- fixed-point operator
Z = function (le)
local function a (f)
return le(function (x) return f(f)(x) end)
end
return a(a)
end
-- non-recursive factorial
F = function (f)
return function (n)
if n == 0 then return 1
else return n*f(n-1) end
end
end
fat = Z(F)
assert(fat(0) == 1 and fat(4) == 24 and Z(F)(5)==5*Z(F)(4))
local function g (z)
local function f (a,b,c,d)
return function (x,y) return a+b+c+d+a+x+y+z end
end
return f(z,z+1,z+2,z+3)
end
f = g(10)
assert(f(9, 16) == 10+11+12+13+10+9+16+10)
Z, F, f = nil
print('+')
-- testing multiple returns
function unlpack (t, i)
i = i or 1
if (i <= #t) then
return t[i], unlpack(t, i+1)
end
end
function equaltab (t1, t2)
assert(#t1 == #t2)
for i = 1, #t1 do
assert(t1[i] == t2[i])
end
end
local pack = function (...) return (table.pack(...)) end
function f() return 1,2,30,4 end
function ret2 (a,b) return a,b end
local a,b,c,d = unlpack{1,2,3}
assert(a==1 and b==2 and c==3 and d==nil)
a = {1,2,3,4,false,10,'alo',false,assert}
equaltab(pack(unlpack(a)), a)
equaltab(pack(unlpack(a), -1), {1,-1})
a,b,c,d = ret2(f()), ret2(f())
assert(a==1 and b==1 and c==2 and d==nil)
a,b,c,d = unlpack(pack(ret2(f()), ret2(f())))
assert(a==1 and b==1 and c==2 and d==nil)
a,b,c,d = unlpack(pack(ret2(f()), (ret2(f()))))
assert(a==1 and b==1 and c==nil and d==nil)
a = ret2{ unlpack{1,2,3}, unlpack{3,2,1}, unlpack{"a", "b"}}
assert(a[1] == 1 and a[2] == 3 and a[3] == "a" and a[4] == "b")
-- testing calls with 'incorrect' arguments
rawget({}, "x", 1)
rawset({}, "x", 1, 2)
assert(math.sin(1,2) == math.sin(1))
table.sort({10,9,8,4,19,23,0,0}, function (a,b) return a<b end, "extra arg")
-- test for generic load
local x = "-- a comment\0\0\0\n x = 10 + \n23; \
local a = function () x = 'hi' end; \
return '\0'"
function read1 (x)
local i = 0
return function ()
collectgarbage()
i=i+1
return string.sub(x, i, i)
end
end
function cannotload (msg, a,b)
assert(not a and string.find(b, msg))
end
a = assert(load(read1(x), "modname", "t", _G))
assert(a() == "\0" and _G.x == 33)
assert(debug.getinfo(a).source == "modname")
-- cannot read text in binary mode
cannotload("attempt to load a text chunk", load(read1(x), "modname", "b", {}))
cannotload("attempt to load a text chunk", load(x, "modname", "b"))
a = assert(load(function () return nil end))
a() -- empty chunk
assert(not load(function () return true end))
-- small bug
local t = {nil, "return ", "3"}
f, msg = load(function () return table.remove(t, 1) end)
assert(f() == nil) -- should read the empty chunk
x = string.dump(load("x = 1; return x"))
a = assert(load(read1(x), nil, "b"))
assert(a() == 1 and _G.x == 1)
cannotload("attempt to load a binary chunk", load(read1(x), nil, "t"))
cannotload("attempt to load a binary chunk", load(x, nil, "t"))
assert(not pcall(string.dump, print)) -- no dump of C functions
cannotload("unexpected symbol", load(read1("*a = 123")))
cannotload("unexpected symbol", load("*a = 123"))
cannotload("hhi", load(function () error("hhi") end))
-- any value is valid for _ENV
assert(load("return _ENV", nil, nil, 123)() == 123)
-- load when _ENV is not first upvalue
local x; XX = 123
local function h ()
local y=x -- use 'x', so that it becomes 1st upvalue
return XX -- global name
end
local d = string.dump(h)
x = load(d, "", "b")
assert(debug.getupvalue(x, 2) == '_ENV')
debug.setupvalue(x, 2, _G)
assert(x() == 123)
assert(assert(load("return XX + ...", nil, nil, {XX = 13}))(4) == 17)
-- test generic load with nested functions
x = [[
return function (x)
return function (y)
return function (z)
return x+y+z
end
end
end
]]
a = assert(load(read1(x)))
assert(a()(2)(3)(10) == 15)
-- test for dump/undump with upvalues
local a, b = 20, 30
x = load(string.dump(function (x)
if x == "set" then a = 10+b; b = b+1 else
return a
end
end))
assert(x() == nil)
assert(debug.setupvalue(x, 1, "hi") == "a")
assert(x() == "hi")
assert(debug.setupvalue(x, 2, 13) == "b")
assert(not debug.setupvalue(x, 3, 10)) -- only 2 upvalues
x("set")
assert(x() == 23)
x("set")
assert(x() == 24)
-- test for bug in parameter adjustment
assert((function () return nil end)(4) == nil)
assert((function () local a; return a end)(4) == nil)
assert((function (a) return a end)() == nil)
print('OK')
return deep

View File

@@ -0,0 +1,77 @@
assert(rawget(_G, "stat") == nil) -- module not loaded before
if T == nil then
stat = function () print"`querytab' not active" end
return
end
function checktable (t)
local asize, hsize, ff = T.querytab(t)
local l = {}
for i=0,hsize-1 do
local key,val,next = T.querytab(t, i + asize)
if key == nil then
assert(l[i] == nil and val==nil and next==nil)
elseif key == "<undef>" then
assert(val==nil)
else
assert(t[key] == val)
local mp = T.hash(key, t)
if l[i] then
assert(l[i] == mp)
elseif mp ~= i then
l[i] = mp
else -- list head
l[mp] = {mp} -- first element
while next do
assert(ff <= next and next < hsize)
if l[next] then assert(l[next] == mp) else l[next] = mp end
table.insert(l[mp], next)
key,val,next = T.querytab(t, next)
assert(key)
end
end
end
end
l.asize = asize; l.hsize = hsize; l.ff = ff
return l
end
function mostra (t)
local asize, hsize, ff = T.querytab(t)
print(asize, hsize, ff)
print'------'
for i=0,asize-1 do
local _, v = T.querytab(t, i)
print(string.format("[%d] -", i), v)
end
print'------'
for i=0,hsize-1 do
print(i, T.querytab(t, i+asize))
end
print'-------------'
end
function stat (t)
t = checktable(t)
local nelem, nlist = 0, 0
local maxlist = {}
for i=0,t.hsize-1 do
if type(t[i]) == 'table' then
local n = table.getn(t[i])
nlist = nlist+1
nelem = nelem + n
if not maxlist[n] then maxlist[n] = 0 end
maxlist[n] = maxlist[n]+1
end
end
print(string.format("hsize=%d elements=%d load=%.2f med.len=%.2f (asize=%d)",
t.hsize, nelem, nelem/t.hsize, nelem/nlist, t.asize))
for i=1,table.getn(maxlist) do
local n = maxlist[i] or 0
print(string.format("%5d %10d %.2f%%", i, n, n*100/nlist))
end
end

Binary file not shown.

View File

@@ -0,0 +1,244 @@
print "testing closures"
local A,B = 0,{g=10}
function f(x)
local a = {}
for i=1,1000 do
local y = 0
do
a[i] = function () B.g = B.g+1; y = y+x; return y+A end
end
end
local dummy = function () return a[A] end
collectgarbage()
A = 1; assert(dummy() == a[1]); A = 0;
assert(a[1]() == x)
assert(a[3]() == x)
collectgarbage()
assert(B.g == 12)
return a
end
local a = f(10)
-- force a GC in this level
local x = {[1] = {}} -- to detect a GC
setmetatable(x, {__mode = 'kv'})
while x[1] do -- repeat until GC
local a = A..A..A..A -- create garbage
A = A+1
end
assert(a[1]() == 20+A)
assert(a[1]() == 30+A)
assert(a[2]() == 10+A)
collectgarbage()
assert(a[2]() == 20+A)
assert(a[2]() == 30+A)
assert(a[3]() == 20+A)
assert(a[8]() == 10+A)
assert(getmetatable(x).__mode == 'kv')
assert(B.g == 19)
-- testing equality
a = {}
for i = 1, 5 do a[i] = function (x) return x + a + _ENV end end
assert(a[3] == a[4] and a[4] == a[5])
for i = 1, 5 do a[i] = function (x) return i + a + _ENV end end
assert(a[3] ~= a[4] and a[4] ~= a[5])
local function f()
return function (x) return math.sin(_ENV[x]) end
end
assert(f() == f())
-- testing closures with 'for' control variable
a = {}
for i=1,10 do
a[i] = {set = function(x) i=x end, get = function () return i end}
if i == 3 then break end
end
assert(a[4] == nil)
a[1].set(10)
assert(a[2].get() == 2)
a[2].set('a')
assert(a[3].get() == 3)
assert(a[2].get() == 'a')
a = {}
local t = {"a", "b"}
for i = 1, #t do
local k = t[i]
a[i] = {set = function(x, y) i=x; k=y end,
get = function () return i, k end}
if i == 2 then break end
end
a[1].set(10, 20)
local r,s = a[2].get()
assert(r == 2 and s == 'b')
r,s = a[1].get()
assert(r == 10 and s == 20)
a[2].set('a', 'b')
r,s = a[2].get()
assert(r == "a" and s == "b")
-- testing closures with 'for' control variable x break
for i=1,3 do
f = function () return i end
break
end
assert(f() == 1)
for k = 1, #t do
local v = t[k]
f = function () return k, v end
break
end
assert(({f()})[1] == 1)
assert(({f()})[2] == "a")
-- testing closure x break x return x errors
local b
function f(x)
local first = 1
while 1 do
if x == 3 and not first then return end
local a = 'xuxu'
b = function (op, y)
if op == 'set' then
a = x+y
else
return a
end
end
if x == 1 then do break end
elseif x == 2 then return
else if x ~= 3 then error() end
end
first = nil
end
end
for i=1,3 do
f(i)
assert(b('get') == 'xuxu')
b('set', 10); assert(b('get') == 10+i)
b = nil
end
pcall(f, 4);
assert(b('get') == 'xuxu')
b('set', 10); assert(b('get') == 14)
local w
-- testing multi-level closure
function f(x)
return function (y)
return function (z) return w+x+y+z end
end
end
y = f(10)
w = 1.345
assert(y(20)(30) == 60+w)
-- testing closures x repeat-until
local a = {}
local i = 1
repeat
local x = i
a[i] = function () i = x+1; return x end
until i > 10 or a[i]() ~= x
assert(i == 11 and a[1]() == 1 and a[3]() == 3 and i == 4)
-- testing closures created in 'then' and 'else' parts of 'if's
a = {}
for i = 1, 10 do
if i % 3 == 0 then
local y = 0
a[i] = function (x) local t = y; y = x; return t end
elseif i % 3 == 1 then
goto L1
error'not here'
::L1::
local y = 1
a[i] = function (x) local t = y; y = x; return t end
elseif i % 3 == 2 then
local t
goto l4
::l4a:: a[i] = t; goto l4b
error("should never be here!")
::l4::
local y = 2
t = function (x) local t = y; y = x; return t end
goto l4a
error("should never be here!")
::l4b::
end
end
for i = 1, 10 do
assert(a[i](i * 10) == i % 3 and a[i]() == i * 10)
end
print'+'
-- test for correctly closing upvalues in tail calls of vararg functions
local function t ()
local function c(a,b) assert(a=="test" and b=="OK") end
local function v(f, ...) c("test", f() ~= 1 and "FAILED" or "OK") end
local x = 1
return v(function() return x end)
end
t()
-- test for debug manipulation of upvalues
local debug = require'debug'
do
local a , b, c = 3, 5, 7
foo1 = function () return a+b end;
foo2 = function () return b+a end;
do
local a = 10
foo3 = function () return a+b end;
end
end
assert(debug.upvalueid(foo1, 1))
assert(debug.upvalueid(foo1, 2))
assert(not pcall(debug.upvalueid, foo1, 3))
assert(debug.upvalueid(foo1, 1) == debug.upvalueid(foo2, 2))
assert(debug.upvalueid(foo1, 2) == debug.upvalueid(foo2, 1))
assert(debug.upvalueid(foo3, 1))
assert(debug.upvalueid(foo1, 1) ~= debug.upvalueid(foo3, 1))
assert(debug.upvalueid(foo1, 2) == debug.upvalueid(foo3, 2))
assert(debug.upvalueid(string.gmatch("x", "x"), 1) ~= nil)
assert(foo1() == 3 + 5 and foo2() == 5 + 3)
debug.upvaluejoin(foo1, 2, foo2, 2)
assert(foo1() == 3 + 3 and foo2() == 5 + 3)
assert(foo3() == 10 + 5)
debug.upvaluejoin(foo3, 2, foo2, 1)
assert(foo3() == 10 + 5)
debug.upvaluejoin(foo3, 2, foo2, 2)
assert(foo3() == 10 + 3)
assert(not pcall(debug.upvaluejoin, foo1, 3, foo2, 1))
assert(not pcall(debug.upvaluejoin, foo1, 1, foo2, 3))
assert(not pcall(debug.upvaluejoin, foo1, 0, foo2, 1))
assert(not pcall(debug.upvaluejoin, print, 1, foo2, 1))
assert(not pcall(debug.upvaluejoin, {}, 1, foo2, 1))
assert(not pcall(debug.upvaluejoin, foo1, 1, print, 1))
print'OK'

Binary file not shown.

View File

@@ -0,0 +1,182 @@
if T==nil then
(Message or print)('\a\n >>> testC not active: skipping opcode tests <<<\n\a')
return
end
print "testing code generation and optimizations"
-- this code gave an error for the code checker
do
local function f (a)
for k,v,w in a do end
end
end
function check (f, ...)
local arg = {...}
local c = T.listcode(f)
for i=1, #arg do
-- print(arg[i], c[i])
assert(string.find(c[i], '- '..arg[i]..' *%d'))
end
assert(c[#arg+2] == nil)
end
function checkequal (a, b)
a = T.listcode(a)
b = T.listcode(b)
for i = 1, #a do
a[i] = string.gsub(a[i], '%b()', '') -- remove line number
b[i] = string.gsub(b[i], '%b()', '') -- remove line number
assert(a[i] == b[i])
end
end
-- some basic instructions
check(function ()
(function () end){f()}
end, 'CLOSURE', 'NEWTABLE', 'GETTABUP', 'CALL', 'SETLIST', 'CALL', 'RETURN')
-- sequence of LOADNILs
check(function ()
local a,b,c
local d; local e;
local f,g,h;
d = nil; d=nil; b=nil; a=nil; c=nil;
end, 'LOADNIL', 'RETURN')
check(function ()
local a,b,c,d = 1,1,1,1
d=nil;c=nil;b=nil;a=nil
end, 'LOADK', 'LOADK', 'LOADK', 'LOADK', 'LOADNIL', 'RETURN')
do
local a,b,c,d = 1,1,1,1
d=nil;c=nil;b=nil;a=nil
assert(a == nil and b == nil and c == nil and d == nil)
end
-- single return
check (function (a,b,c) return a end, 'RETURN')
-- infinite loops
check(function () while true do local a = -1 end end,
'LOADK', 'JMP', 'RETURN')
check(function () while 1 do local a = -1 end end,
'LOADK', 'JMP', 'RETURN')
check(function () repeat local x = 1 until true end,
'LOADK', 'RETURN')
-- concat optimization
check(function (a,b,c,d) return a..b..c..d end,
'MOVE', 'MOVE', 'MOVE', 'MOVE', 'CONCAT', 'RETURN')
-- not
check(function () return not not nil end, 'LOADBOOL', 'RETURN')
check(function () return not not false end, 'LOADBOOL', 'RETURN')
check(function () return not not true end, 'LOADBOOL', 'RETURN')
check(function () return not not 1 end, 'LOADBOOL', 'RETURN')
-- direct access to locals
check(function ()
local a,b,c,d
a = b*2
c[4], a[b] = -((a + d/-20.5 - a[b]) ^ a.x), b
end,
'LOADNIL',
'MUL',
'DIV', 'ADD', 'GETTABLE', 'SUB', 'GETTABLE', 'POW',
'UNM', 'SETTABLE', 'SETTABLE', 'RETURN')
-- direct access to constants
check(function ()
local a,b
a.x = 0
a.x = b
a[b] = 'y'
a = 1 - a
b = 1/a
b = 5+4
a[true] = false
end,
'LOADNIL',
'SETTABLE', 'SETTABLE', 'SETTABLE', 'SUB', 'DIV', 'LOADK',
'SETTABLE', 'RETURN')
-- constant folding
local function f () return -((2^8 + -(-1)) % 8)/2 * 4 - 3 end
check(f, 'LOADK', 'RETURN')
assert(f() == -5)
-- bug in constant folding for 5.1
check(function () return -nil end,
'LOADNIL', 'UNM', 'RETURN')
check(function ()
local a,b,c
b[c], a = c, b
b[a], a = c, b
a, b = c, a
a = a
end,
'LOADNIL',
'MOVE', 'MOVE', 'SETTABLE',
'MOVE', 'MOVE', 'MOVE', 'SETTABLE',
'MOVE', 'MOVE', 'MOVE',
-- no code for a = a
'RETURN')
-- x == nil , x ~= nil
checkequal(function () if (a==nil) then a=1 end; if a~=nil then a=1 end end,
function () if (a==9) then a=1 end; if a~=9 then a=1 end end)
check(function () if a==nil then a=1 end end,
'GETTABUP', 'EQ', 'JMP', 'SETTABUP', 'RETURN')
-- de morgan
checkequal(function () local a; if not (a or b) then b=a end end,
function () local a; if (not a and not b) then b=a end end)
checkequal(function (l) local a; return 0 <= a and a <= l end,
function (l) local a; return not (not(a >= 0) or not(a <= l)) end)
-- if-goto optimizations
check(function (a)
if a == 1 then goto l1
elseif a == 2 then goto l2
elseif a == 3 then goto l2
else if a == 4 then goto l3
else goto l3
end
end
::l1:: ::l2:: ::l3:: ::l4::
end, 'EQ', 'JMP', 'EQ', 'JMP', 'EQ', 'JMP', 'EQ', 'JMP', 'JMP', 'RETURN')
checkequal(
function (a) while a < 10 do a = a + 1 end end,
function (a) ::L2:: if not(a < 10) then goto L1 end; a = a + 1;
goto L2; ::L1:: end
)
checkequal(
function (a) while a < 10 do a = a + 1 end end,
function (a) while true do if not(a < 10) then break end; a = a + 1; end end
)
print 'OK'

View File

@@ -0,0 +1,310 @@
;;print "testing syntax";;
local debug = require "debug"
-- testing semicollons
do ;;; end
; do ; a = 3; assert(a == 3) end;
;
-- testing priorities
assert(2^3^2 == 2^(3^2));
assert(2^3*4 == (2^3)*4);
assert(2^-2 == 1/4 and -2^- -2 == - - -4);
assert(not nil and 2 and not(2>3 or 3<2));
assert(-3-1-5 == 0+0-9);
assert(-2^2 == -4 and (-2)^2 == 4 and 2*2-3-1 == 0);
assert(2*1+3/3 == 3 and 1+2 .. 3*1 == "33");
assert(not(2+1 > 3*1) and "a".."b" > "a");
assert(not ((true or false) and nil))
assert( true or false and nil)
-- old bug
assert((((1 or false) and true) or false) == true)
assert((((nil and true) or false) and true) == false)
local a,b = 1,nil;
assert(-(1 or 2) == -1 and (1 and 2)+(-1.25 or -4) == 0.75);
x = ((b or a)+1 == 2 and (10 or a)+1 == 11); assert(x);
x = (((2<3) or 1) == true and (2<3 and 4) == 4); assert(x);
x,y=1,2;
assert((x>y) and x or y == 2);
x,y=2,1;
assert((x>y) and x or y == 2);
assert(1234567890 == tonumber('1234567890') and 1234567890+1 == 1234567891)
-- silly loops
repeat until 1; repeat until true;
while false do end; while nil do end;
do -- test old bug (first name could not be an `upvalue')
local a; function f(x) x={a=1}; x={x=1}; x={G=1} end
end
function f (i)
if type(i) ~= 'number' then return i,'jojo'; end;
if i > 0 then return i, f(i-1); end;
end
x = {f(3), f(5), f(10);};
assert(x[1] == 3 and x[2] == 5 and x[3] == 10 and x[4] == 9 and x[12] == 1);
assert(x[nil] == nil)
x = {f'alo', f'xixi', nil};
assert(x[1] == 'alo' and x[2] == 'xixi' and x[3] == nil);
x = {f'alo'..'xixi'};
assert(x[1] == 'aloxixi')
x = {f{}}
assert(x[2] == 'jojo' and type(x[1]) == 'table')
local f = function (i)
if i < 10 then return 'a';
elseif i < 20 then return 'b';
elseif i < 30 then return 'c';
end;
end
assert(f(3) == 'a' and f(12) == 'b' and f(26) == 'c' and f(100) == nil)
for i=1,1000 do break; end;
n=100;
i=3;
t = {};
a=nil
while not a do
a=0; for i=1,n do for i=i,1,-1 do a=a+1; t[i]=1; end; end;
end
assert(a == n*(n+1)/2 and i==3);
assert(t[1] and t[n] and not t[0] and not t[n+1])
function f(b)
local x = 1;
repeat
local a;
if b==1 then local b=1; x=10; break
elseif b==2 then x=20; break;
elseif b==3 then x=30;
else local a,b,c,d=math.sin(1); x=x+1;
end
until x>=12;
return x;
end;
assert(f(1) == 10 and f(2) == 20 and f(3) == 30 and f(4)==12)
local f = function (i)
if i < 10 then return 'a'
elseif i < 20 then return 'b'
elseif i < 30 then return 'c'
else return 8
end
end
assert(f(3) == 'a' and f(12) == 'b' and f(26) == 'c' and f(100) == 8)
local a, b = nil, 23
x = {f(100)*2+3 or a, a or b+2}
assert(x[1] == 19 and x[2] == 25)
x = {f=2+3 or a, a = b+2}
assert(x.f == 5 and x.a == 25)
a={y=1}
x = {a.y}
assert(x[1] == 1)
function f(i)
while 1 do
if i>0 then i=i-1;
else return; end;
end;
end;
function g(i)
while 1 do
if i>0 then i=i-1
else return end
end
end
f(10); g(10);
do
function f () return 1,2,3; end
local a, b, c = f();
assert(a==1 and b==2 and c==3)
a, b, c = (f());
assert(a==1 and b==nil and c==nil)
end
local a,b = 3 and f();
assert(a==1 and b==nil)
function g() f(); return; end;
assert(g() == nil)
function g() return nil or f() end
a,b = g()
assert(a==1 and b==nil)
print'+';
f = [[
return function ( a , b , c , d , e )
local x = a >= b or c or ( d and e ) or nil
return x
end , { a = 1 , b = 2 >= 1 , } or { 1 };
]]
f = string.gsub(f, "%s+", "\n"); -- force a SETLINE between opcodes
f,a = load(f)();
assert(a.a == 1 and a.b)
function g (a,b,c,d,e)
if not (a>=b or c or d and e or nil) then return 0; else return 1; end;
end
function h (a,b,c,d,e)
while (a>=b or c or (d and e) or nil) do return 1; end;
return 0;
end;
assert(f(2,1) == true and g(2,1) == 1 and h(2,1) == 1)
assert(f(1,2,'a') == 'a' and g(1,2,'a') == 1 and h(1,2,'a') == 1)
assert(f(1,2,'a')
~= -- force SETLINE before nil
nil, "")
assert(f(1,2,'a') == 'a' and g(1,2,'a') == 1 and h(1,2,'a') == 1)
assert(f(1,2,nil,1,'x') == 'x' and g(1,2,nil,1,'x') == 1 and
h(1,2,nil,1,'x') == 1)
assert(f(1,2,nil,nil,'x') == nil and g(1,2,nil,nil,'x') == 0 and
h(1,2,nil,nil,'x') == 0)
assert(f(1,2,nil,1,nil) == nil and g(1,2,nil,1,nil) == 0 and
h(1,2,nil,1,nil) == 0)
assert(1 and 2<3 == true and 2<3 and 'a'<'b' == true)
x = 2<3 and not 3; assert(x==false)
x = 2<1 or (2>1 and 'a'); assert(x=='a')
do
local a; if nil then a=1; else a=2; end; -- this nil comes as PUSHNIL 2
assert(a==2)
end
function F(a)
assert(debug.getinfo(1, "n").name == 'F')
return a,2,3
end
a,b = F(1)~=nil; assert(a == true and b == nil);
a,b = F(nil)==nil; assert(a == true and b == nil)
----------------------------------------------------------------
-- creates all combinations of
-- [not] ([not] arg op [not] (arg op [not] arg ))
-- and tests each one
function ID(x) return x end
function f(t, i)
local b = t.n
local res = math.fmod(math.floor(i/c), b)+1
c = c*b
return t[res]
end
local arg = {" ( 1 < 2 ) ", " ( 1 >= 2 ) ", " F ( ) ", " nil "; n=4}
local op = {" and ", " or ", " == ", " ~= "; n=4}
local neg = {" ", " not "; n=2}
local i = 0
repeat
c = 1
local s = f(neg, i)..'ID('..f(neg, i)..f(arg, i)..f(op, i)..
f(neg, i)..'ID('..f(arg, i)..f(op, i)..f(neg, i)..f(arg, i)..'))'
local s1 = string.gsub(s, 'ID', '')
K,X,NX,WX1,WX2 = nil
s = string.format([[
local a = %s
local b = not %s
K = b
local xxx;
if %s then X = a else X = b end
if %s then NX = b else NX = a end
while %s do WX1 = a; break end
while %s do WX2 = a; break end
repeat if (%s) then break end; assert(b) until not(%s)
]], s1, s, s1, s, s1, s, s1, s, s)
assert(load(s))()
assert(X and not NX and not WX1 == K and not WX2 == K)
if math.fmod(i,4000) == 0 then print('+') end
i = i+1
until i==c
print '+'
------------------------------------------------------------------
print 'testing short-circuit optimizations'
_ENV.GLOB1 = 1
_ENV.GLOB2 = 2
local basiccases = {
{"nil", nil},
{"false", false},
{"true", true},
{"10", 10},
{"(_ENV.GLOB1 < _ENV.GLOB2)", true},
{"(_ENV.GLOB2 < _ENV.GLOB1)", false},
}
local binops = {
{" and ", function (a,b) if not a then return a else return b end end},
{" or ", function (a,b) if a then return a else return b end end},
}
local mem = {basiccases} -- for memoization
local function allcases (n)
if mem[n] then return mem[n] end
local res = {}
-- include all smaller cases
for _, v in ipairs(allcases(n - 1)) do
res[#res + 1] = v
end
for i = 1, n - 1 do
for _, v1 in ipairs(allcases(i)) do
for _, v2 in ipairs(allcases(n - i)) do
for _, op in ipairs(binops) do
res[#res + 1] = {
"(" .. v1[1] .. op[1] .. v2[1] .. ")",
op[2](v1[2], v2[2])
}
end
end
end
print('+')
end
mem[n] = res -- memoize
return res
end
-- do not do too many combinations for soft tests
local level = _soft and 3 or 4
for _, v in pairs(allcases(level)) do
local res = load("return " .. v[1])()
assert(res == v[2])
end
------------------------------------------------------------------
print'OK'

View File

@@ -0,0 +1,728 @@
print "testing coroutines"
local debug = require'debug'
local f
local main, ismain = coroutine.running()
assert(type(main) == "thread" and ismain)
assert(not coroutine.resume(main))
assert(not pcall(coroutine.yield))
-- tests for multiple yield/resume arguments
local function eqtab (t1, t2)
assert(#t1 == #t2)
for i = 1, #t1 do
local v = t1[i]
assert(t2[i] == v)
end
end
_G.x = nil -- declare x
function foo (a, ...)
local x, y = coroutine.running()
assert(x == f and y == false)
assert(coroutine.status(f) == "running")
local arg = {...}
for i=1,#arg do
_G.x = {coroutine.yield(table.unpack(arg[i]))}
end
return table.unpack(a)
end
f = coroutine.create(foo)
assert(type(f) == "thread" and coroutine.status(f) == "suspended")
assert(string.find(tostring(f), "thread"))
local s,a,b,c,d
s,a,b,c,d = coroutine.resume(f, {1,2,3}, {}, {1}, {'a', 'b', 'c'})
assert(s and a == nil and coroutine.status(f) == "suspended")
s,a,b,c,d = coroutine.resume(f)
eqtab(_G.x, {})
assert(s and a == 1 and b == nil)
s,a,b,c,d = coroutine.resume(f, 1, 2, 3)
eqtab(_G.x, {1, 2, 3})
assert(s and a == 'a' and b == 'b' and c == 'c' and d == nil)
s,a,b,c,d = coroutine.resume(f, "xuxu")
eqtab(_G.x, {"xuxu"})
assert(s and a == 1 and b == 2 and c == 3 and d == nil)
assert(coroutine.status(f) == "dead")
s, a = coroutine.resume(f, "xuxu")
assert(not s and string.find(a, "dead") and coroutine.status(f) == "dead")
-- yields in tail calls
local function foo (i) return coroutine.yield(i) end
f = coroutine.wrap(function ()
for i=1,10 do
assert(foo(i) == _G.x)
end
return 'a'
end)
for i=1,10 do _G.x = i; assert(f(i) == i) end
_G.x = 'xuxu'; assert(f('xuxu') == 'a')
-- recursive
function pf (n, i)
coroutine.yield(n)
pf(n*i, i+1)
end
f = coroutine.wrap(pf)
local s=1
for i=1,10 do
assert(f(1, 1) == s)
s = s*i
end
-- sieve
function gen (n)
return coroutine.wrap(function ()
for i=2,n do coroutine.yield(i) end
end)
end
function filter (p, g)
return coroutine.wrap(function ()
while 1 do
local n = g()
if n == nil then return end
if math.fmod(n, p) ~= 0 then coroutine.yield(n) end
end
end)
end
local x = gen(100)
local a = {}
while 1 do
local n = x()
if n == nil then break end
table.insert(a, n)
x = filter(n, x)
end
assert(#a == 25 and a[#a] == 97)
-- yielding across C boundaries
co = coroutine.wrap(function()
assert(not pcall(table.sort,{1,2,3}, coroutine.yield))
coroutine.yield(20)
return 30
end)
assert(co() == 20)
assert(co() == 30)
local f = function (s, i) return coroutine.yield(i) end
local f1 = coroutine.wrap(function ()
return xpcall(pcall, function (...) return ... end,
function ()
local s = 0
for i in f, nil, 1 do pcall(function () s = s + i end) end
error({s})
end)
end)
f1()
for i = 1, 10 do assert(f1(i) == i) end
local r1, r2, v = f1(nil)
assert(r1 and not r2 and v[1] == (10 + 1)*10/2)
function f (a, b) a = coroutine.yield(a); error{a + b} end
function g(x) return x[1]*2 end
co = coroutine.wrap(function ()
coroutine.yield(xpcall(f, g, 10, 20))
end)
assert(co() == 10)
r, msg = co(100)
assert(not r and msg == 240)
-- errors in coroutines
function foo ()
assert(debug.getinfo(1).currentline == debug.getinfo(foo).linedefined + 1)
assert(debug.getinfo(2).currentline == debug.getinfo(goo).linedefined)
coroutine.yield(3)
error(foo)
end
function goo() foo() end
x = coroutine.wrap(goo)
assert(x() == 3)
local a,b = pcall(x)
assert(not a and b == foo)
x = coroutine.create(goo)
a,b = coroutine.resume(x)
assert(a and b == 3)
a,b = coroutine.resume(x)
assert(not a and b == foo and coroutine.status(x) == "dead")
a,b = coroutine.resume(x)
assert(not a and string.find(b, "dead") and coroutine.status(x) == "dead")
-- co-routines x for loop
function all (a, n, k)
if k == 0 then coroutine.yield(a)
else
for i=1,n do
a[k] = i
all(a, n, k-1)
end
end
end
local a = 0
for t in coroutine.wrap(function () all({}, 5, 4) end) do
a = a+1
end
assert(a == 5^4)
-- access to locals of collected corroutines
local C = {}; setmetatable(C, {__mode = "kv"})
local x = coroutine.wrap (function ()
local a = 10
local function f () a = a+10; return a end
while true do
a = a+1
coroutine.yield(f)
end
end)
C[1] = x;
local f = x()
assert(f() == 21 and x()() == 32 and x() == f)
x = nil
collectgarbage()
assert(C[1] == nil)
assert(f() == 43 and f() == 53)
-- old bug: attempt to resume itself
function co_func (current_co)
assert(coroutine.running() == current_co)
assert(coroutine.resume(current_co) == false)
assert(coroutine.resume(current_co) == false)
return 10
end
local co = coroutine.create(co_func)
local a,b = coroutine.resume(co, co)
assert(a == true and b == 10)
assert(coroutine.resume(co, co) == false)
assert(coroutine.resume(co, co) == false)
-- attempt to resume 'normal' coroutine
co1 = coroutine.create(function () return co2() end)
co2 = coroutine.wrap(function ()
assert(coroutine.status(co1) == 'normal')
assert(not coroutine.resume(co1))
coroutine.yield(3)
end)
a,b = coroutine.resume(co1)
assert(a and b == 3)
assert(coroutine.status(co1) == 'dead')
-- infinite recursion of coroutines
a = function(a) coroutine.wrap(a)(a) end
assert(not pcall(a, a))
-- access to locals of erroneous coroutines
local x = coroutine.create (function ()
local a = 10
_G.f = function () a=a+1; return a end
error('x')
end)
assert(not coroutine.resume(x))
-- overwrite previous position of local `a'
assert(not coroutine.resume(x, 1, 1, 1, 1, 1, 1, 1))
assert(_G.f() == 11)
assert(_G.f() == 12)
if not T then
(Message or print)('\a\n >>> testC not active: skipping yield/hook tests <<<\n\a')
else
print "testing yields inside hooks"
local turn
function fact (t, x)
assert(turn == t)
if x == 0 then return 1
else return x*fact(t, x-1)
end
end
local A,B,a,b = 0,0,0,0
local x = coroutine.create(function ()
T.sethook("yield 0", "", 2)
A = fact("A", 10)
end)
local y = coroutine.create(function ()
T.sethook("yield 0", "", 3)
B = fact("B", 11)
end)
while A==0 or B==0 do
if A==0 then turn = "A"; assert(T.resume(x)) end
if B==0 then turn = "B"; assert(T.resume(y)) end
end
assert(B/A == 11)
local line = debug.getinfo(1, "l").currentline + 2 -- get line number
local function foo ()
local x = 10 --<< this line is 'line'
x = x + 10
_G.XX = x
end
-- testing yields in line hook
local co = coroutine.wrap(function ()
T.sethook("setglobal X; yield 0", "l", 0); foo(); return 10 end)
_G.XX = nil;
_G.X = nil; co(); assert(_G.X == line)
_G.X = nil; co(); assert(_G.X == line + 1)
_G.X = nil; co(); assert(_G.X == line + 2 and _G.XX == nil)
_G.X = nil; co(); assert(_G.X == line + 3 and _G.XX == 20)
assert(co() == 10)
-- testing yields in count hook
co = coroutine.wrap(function ()
T.sethook("yield 0", "", 1); foo(); return 10 end)
_G.XX = nil;
local c = 0
repeat c = c + 1; local a = co() until a == 10
assert(_G.XX == 20 and c == 10)
co = coroutine.wrap(function ()
T.sethook("yield 0", "", 2); foo(); return 10 end)
_G.XX = nil;
local c = 0
repeat c = c + 1; local a = co() until a == 10
assert(_G.XX == 20 and c == 5)
_G.X = nil; _G.XX = nil
print "testing coroutine API"
-- reusing a thread
assert(T.testC([[
newthread # create thread
pushvalue 2 # push body
pushstring 'a a a' # push argument
xmove 0 3 2 # move values to new thread
resume -1, 1 # call it first time
pushstatus
xmove 3 0 0 # move results back to stack
setglobal X # result
setglobal Y # status
pushvalue 2 # push body (to call it again)
pushstring 'b b b'
xmove 0 3 2
resume -1, 1 # call it again
pushstatus
xmove 3 0 0
return 1 # return result
]], function (...) return ... end) == 'b b b')
assert(X == 'a a a' and Y == 'OK')
-- resuming running coroutine
C = coroutine.create(function ()
return T.testC([[
pushnum 10;
pushnum 20;
resume -3 2;
pushstatus
gettop;
return 3]], C)
end)
local a, b, c, d = coroutine.resume(C)
assert(a == true and string.find(b, "non%-suspended") and
c == "ERRRUN" and d == 4)
a, b, c, d = T.testC([[
rawgeti R 1 # get main thread
pushnum 10;
pushnum 20;
resume -3 2;
pushstatus
gettop;
return 4]])
assert(a == coroutine.running() and string.find(b, "non%-suspended") and
c == "ERRRUN" and d == 4)
-- using a main thread as a coroutine
local state = T.newstate()
T.loadlib(state)
assert(T.doremote(state, [[
coroutine = require'coroutine';
X = function (x) coroutine.yield(x, 'BB'); return 'CC' end;
return 'ok']]))
t = table.pack(T.testC(state, [[
rawgeti R 1 # get main thread
pushstring 'XX'
getglobal X # get function for body
pushstring AA # arg
resume 1 1 # 'resume' shadows previous stack!
gettop
setglobal T # top
setglobal B # second yielded value
setglobal A # fist yielded value
rawgeti R 1 # get main thread
pushnum 5 # arg (noise)
resume 1 1 # after coroutine ends, previous stack is back
pushstatus
gettop
return .
]]))
assert(t.n == 4 and t[2] == 'XX' and t[3] == 'CC' and t[4] == 'OK')
assert(T.doremote(state, "return T") == '2')
assert(T.doremote(state, "return A") == 'AA')
assert(T.doremote(state, "return B") == 'BB')
T.closestate(state)
print'+'
end
-- leaving a pending coroutine open
_X = coroutine.wrap(function ()
local a = 10
local x = function () a = a+1 end
coroutine.yield()
end)
_X()
if not _soft then
-- bug (stack overflow)
local j = 2^9
local lim = 1000000 -- (C stack limit; assume 32-bit machine)
local t = {lim - 10, lim - 5, lim - 1, lim, lim + 1}
for i = 1, #t do
local j = t[i]
co = coroutine.create(function()
local t = {}
for i = 1, j do t[i] = i end
return table.unpack(t)
end)
local r, msg = coroutine.resume(co)
assert(not r)
end
end
assert(coroutine.running() == main)
print"+"
print"testing yields inside metamethods"
local mt = {
__eq = function(a,b) coroutine.yield(nil, "eq"); return a.x == b.x end,
__lt = function(a,b) coroutine.yield(nil, "lt"); return a.x < b.x end,
__le = function(a,b) coroutine.yield(nil, "le"); return a - b <= 0 end,
__add = function(a,b) coroutine.yield(nil, "add"); return a.x + b.x end,
__sub = function(a,b) coroutine.yield(nil, "sub"); return a.x - b.x end,
__concat = function(a,b)
coroutine.yield(nil, "concat");
a = type(a) == "table" and a.x or a
b = type(b) == "table" and b.x or b
return a .. b
end,
__index = function (t,k) coroutine.yield(nil, "idx"); return t.k[k] end,
__newindex = function (t,k,v) coroutine.yield(nil, "nidx"); t.k[k] = v end,
}
local function new (x)
return setmetatable({x = x, k = {}}, mt)
end
local a = new(10)
local b = new(12)
local c = new"hello"
local function run (f, t)
local i = 1
local c = coroutine.wrap(f)
while true do
local res, stat = c()
if res then assert(t[i] == nil); return res, t end
assert(stat == t[i])
i = i + 1
end
end
assert(run(function () if (a>=b) then return '>=' else return '<' end end,
{"le", "sub"}) == "<")
-- '<=' using '<'
mt.__le = nil
assert(run(function () if (a<=b) then return '<=' else return '>' end end,
{"lt"}) == "<=")
assert(run(function () if (a==b) then return '==' else return '~=' end end,
{"eq"}) == "~=")
assert(run(function () return a..b end, {"concat"}) == "1012")
assert(run(function() return a .. b .. c .. a end,
{"concat", "concat", "concat"}) == "1012hello10")
assert(run(function() return "a" .. "b" .. a .. "c" .. c .. b .. "x" end,
{"concat", "concat", "concat"}) == "ab10chello12x")
assert(run(function ()
a.BB = print
return a.BB
end, {"nidx", "idx"}) == print)
-- getuptable & setuptable
do local _ENV = _ENV
f = function () AAA = BBB + 1; return AAA end
end
g = new(10); g.k.BBB = 10;
debug.setupvalue(f, 1, g)
assert(run(f, {"idx", "nidx", "idx"}) == 11)
assert(g.k.AAA == 11)
print"+"
print"testing yields inside 'for' iterators"
local f = function (s, i)
if i%2 == 0 then coroutine.yield(nil, "for") end
if i < s then return i + 1 end
end
assert(run(function ()
local s = 0
for i in f, 4, 0 do s = s + i end
return s
end, {"for", "for", "for"}) == 10)
-- tests for coroutine API
if T==nil then
(Message or print)('\a\n >>> testC not active: skipping coroutine API tests <<<\n\a')
return
end
print('testing coroutine API')
local function apico (...)
local x = {...}
return coroutine.wrap(function ()
return T.testC(table.unpack(x))
end)
end
local a = {apico(
[[
pushstring errorcode
pcallk 1 0 2;
invalid command (should not arrive here)
]],
[[getctx; gettop; return .]],
"stackmark",
error
)()}
assert(#a == 6 and
a[3] == "stackmark" and
a[4] == "errorcode" and
a[5] == "ERRRUN" and
a[6] == 2) -- 'ctx' to pcallk
local co = apico(
"pushvalue 2; pushnum 10; pcallk 1 2 3; invalid command;",
coroutine.yield,
"getctx; pushvalue 2; pushstring a; pcallk 1 0 4; invalid command",
"getctx; gettop; return .")
assert(co() == 10)
assert(co(20, 30) == 'a')
a = {co()}
assert(#a == 10 and
a[2] == coroutine.yield and
a[5] == 20 and a[6] == 30 and
a[7] == "YIELD" and a[8] == 3 and
a[9] == "YIELD" and a[10] == 4)
assert(not pcall(co)) -- coroutine is dead now
f = T.makeCfunc("pushnum 3; pushnum 5; yield 1;")
co = coroutine.wrap(function ()
assert(f() == 23); assert(f() == 23); return 10
end)
assert(co(23,16) == 5)
assert(co(23,16) == 5)
assert(co(23,16) == 10)
-- testing coroutines with C bodies
f = T.makeCfunc([[
pushnum 102
yieldk 1 U2
return 2
]],
[[
pushnum 23 # continuation
gettop
return .
]])
x = coroutine.wrap(f)
assert(x() == 102)
assert(x() == 23)
f = T.makeCfunc[[pushstring 'a'; pushnum 102; yield 2; ]]
a, b, c, d = T.testC([[newthread; pushvalue 2; xmove 0 3 1; resume 3 0;
pushstatus; xmove 3 0 0; resume 3 0; pushstatus;
return 4; ]], f)
assert(a == 'YIELD' and b == 'a' and c == 102 and d == 'OK')
-- testing chain of suspendable C calls
local count = 3 -- number of levels
f = T.makeCfunc([[
remove 1; # remove argument
pushvalue U3; # get selection function
call 0 1; # call it (result is 'f' or 'yield')
pushstring hello # single argument for selected function
pushupvalueindex 2; # index of continuation program
callk 1 -1 .; # call selected function
errorerror # should never arrive here
]],
[[
# continuation program
pushnum 34 # return value
gettop
return . # return all results
]],
function () -- selection function
count = count - 1
if count == 0 then return coroutine.yield
else return f
end
end
)
co = coroutine.wrap(function () return f(nil) end)
assert(co() == "hello") -- argument to 'yield'
a = {co()}
-- three '34's (one from each pending C call)
assert(#a == 3 and a[1] == a[2] and a[2] == a[3] and a[3] == 34)
-- testing yields with continuations
co = coroutine.wrap(function (...) return
T.testC([[
getctx
yieldk 3 2
nonexec error
]],
[[ # continuation
getctx
yieldk 2 3
]],
[[ # continuation
getctx
yieldk 2 4
]],
[[ # continuation
pushvalue 6; pushnum 10; pushnum 20;
pcall 2 0 # call should throw an error and execution continues
pop 1 # remove error message
pushvalue 6
getctx
pcallk 2 2 5 # call should throw an error and jump to continuation
cannot be here!
]],
[[ # continuation
gettop
return .
]],
function (a,b) x=a; y=b; error("errmsg") end,
...
)
end)
local a = {co(3,4,6)}; assert(a[1] == 6 and a[2] == "OK" and a[3] == 0)
a = {co()}; assert(a[1] == "YIELD" and a[2] == 2)
a = {co()}; assert(a[1] == "YIELD" and a[2] == 3)
a = {co(7,8)};
-- original arguments
assert(type(a[1]) == 'string' and type(a[2]) == 'string' and
type(a[3]) == 'string' and type(a[4]) == 'string' and
type(a[5]) == 'string' and type(a[6]) == 'function')
-- arguments left from fist resume
assert(a[7] == 3 and a[8] == 4)
-- arguments to last resume
assert(a[9] == 7 and a[10] == 8)
-- error message and nothing more
assert(a[11]:find("errmsg") and #a == 11)
-- check arguments to pcallk
assert(x == "YIELD" and y == 4)
assert(not pcall(co)) -- coroutine should be dead
-- testing ctx
a,b = T.testC(
[[ pushstring print; pcallk 0 0 12 # error
getctx; return 2 ]])
assert(a == "OK" and b == 0) -- no ctx outside continuations
-- bug in nCcalls
local co = coroutine.wrap(function ()
local a = {pcall(pcall,pcall,pcall,pcall,pcall,pcall,pcall,error,"hi")}
return pcall(assert, table.unpack(a))
end)
local a = {co()}
assert(a[10] == "hi")
print'OK'

Binary file not shown.

View File

@@ -0,0 +1,631 @@
-- testing debug library
debug = require "debug"
local function dostring(s) return assert(load(s))() end
print"testing debug library and debug information"
do
local a=1
end
function test (s, l, p)
collectgarbage() -- avoid gc during trace
local function f (event, line)
assert(event == 'line')
local l = table.remove(l, 1)
if p then print(l, line) end
assert(l == line, "wrong trace!!")
end
debug.sethook(f,"l"); load(s)(); debug.sethook()
assert(#l == 0)
end
do
assert(not pcall(debug.getinfo, print, "X")) -- invalid option
assert(debug.getinfo(1000) == nil) -- out of range level
assert(debug.getinfo(-1) == nil) -- out of range level
local a = debug.getinfo(print)
assert(a.what == "C" and a.short_src == "[C]")
a = debug.getinfo(print, "L")
assert(a.activelines == nil)
local b = debug.getinfo(test, "SfL")
assert(b.name == nil and b.what == "Lua" and b.linedefined == 13 and
b.lastlinedefined == b.linedefined + 10 and
b.func == test and not string.find(b.short_src, "%["))
assert(b.activelines[b.linedefined + 1] and
b.activelines[b.lastlinedefined])
assert(not b.activelines[b.linedefined] and
not b.activelines[b.lastlinedefined + 1])
end
-- test file and string names truncation
a = "function f () end"
local function dostring (s, x) return load(s, x)() end
dostring(a)
assert(debug.getinfo(f).short_src == string.format('[string "%s"]', a))
dostring(a..string.format("; %s\n=1", string.rep('p', 400)))
assert(string.find(debug.getinfo(f).short_src, '^%[string [^\n]*%.%.%."%]$'))
dostring(a..string.format("; %s=1", string.rep('p', 400)))
assert(string.find(debug.getinfo(f).short_src, '^%[string [^\n]*%.%.%."%]$'))
dostring("\n"..a)
assert(debug.getinfo(f).short_src == '[string "..."]')
dostring(a, "")
assert(debug.getinfo(f).short_src == '[string ""]')
dostring(a, "@xuxu")
assert(debug.getinfo(f).short_src == "xuxu")
dostring(a, "@"..string.rep('p', 1000)..'t')
assert(string.find(debug.getinfo(f).short_src, "^%.%.%.p*t$"))
dostring(a, "=xuxu")
assert(debug.getinfo(f).short_src == "xuxu")
dostring(a, string.format("=%s", string.rep('x', 500)))
assert(string.find(debug.getinfo(f).short_src, "^x*$"))
dostring(a, "=")
assert(debug.getinfo(f).short_src == "")
a = nil; f = nil;
repeat
local g = {x = function ()
local a = debug.getinfo(2)
assert(a.name == 'f' and a.namewhat == 'local')
a = debug.getinfo(1)
assert(a.name == 'x' and a.namewhat == 'field')
return 'xixi'
end}
local f = function () return 1+1 and (not 1 or g.x()) end
assert(f() == 'xixi')
g = debug.getinfo(f)
assert(g.what == "Lua" and g.func == f and g.namewhat == "" and not g.name)
function f (x, name) -- local!
name = name or 'f'
local a = debug.getinfo(1)
assert(a.name == name and a.namewhat == 'local')
return x
end
-- breaks in different conditions
if 3>4 then break end; f()
if 3<4 then a=1 else break end; f()
while 1 do local x=10; break end; f()
local b = 1
if 3>4 then return math.sin(1) end; f()
a = 3<4; f()
a = 3<4 or 1; f()
repeat local x=20; if 4>3 then f() else break end; f() until 1
g = {}
f(g).x = f(2) and f(10)+f(9)
assert(g.x == f(19))
function g(x) if not x then return 3 end return (x('a', 'x')) end
assert(g(f) == 'a')
until 1
test([[if
math.sin(1)
then
a=1
else
a=2
end
]], {2,3,4,7})
test([[--
if nil then
a=1
else
a=2
end
]], {2,5,6})
test([[a=1
repeat
a=a+1
until a==3
]], {1,3,4,3,4})
test([[ do
return
end
]], {2})
test([[local a
a=1
while a<=3 do
a=a+1
end
]], {1,2,3,4,3,4,3,4,3,5})
test([[while math.sin(1) do
if math.sin(1)
then break
end
end
a=1]], {1,2,3,6})
test([[for i=1,3 do
a=i
end
]], {1,2,1,2,1,2,1,3})
test([[for i,v in pairs{'a','b'} do
a=i..v
end
]], {1,2,1,2,1,3})
test([[for i=1,4 do a=1 end]], {1,1,1,1,1})
print'+'
-- invalid levels in [gs]etlocal
assert(not pcall(debug.getlocal, 20, 1))
assert(not pcall(debug.setlocal, -1, 1, 10))
-- parameter names
local function foo (a,b,...) local d, e end
local co = coroutine.create(foo)
assert(debug.getlocal(foo, 1) == 'a')
assert(debug.getlocal(foo, 2) == 'b')
assert(debug.getlocal(foo, 3) == nil)
assert(debug.getlocal(co, foo, 1) == 'a')
assert(debug.getlocal(co, foo, 2) == 'b')
assert(debug.getlocal(co, foo, 3) == nil)
assert(debug.getlocal(print, 1) == nil)
-- varargs
local function foo (a, ...)
local t = table.pack(...)
for i = 1, t.n do
local n, v = debug.getlocal(1, -i)
assert(n == "(*vararg)" and v == t[i])
end
assert(not debug.getlocal(1, -(t.n + 1)))
assert(not debug.setlocal(1, -(t.n + 1), 30))
if t.n > 0 then
(function (x)
assert(debug.setlocal(2, -1, x) == "(*vararg)")
assert(debug.setlocal(2, -t.n, x) == "(*vararg)")
end)(430)
assert(... == 430)
end
end
foo()
foo(print)
foo(200, 3, 4)
local a = {}
for i = 1,1000 do a[i] = i end
foo(table.unpack(a))
a = nil
-- access to vararg in non-vararg function
local function foo () return debug.getlocal(1, -1) end
assert(foo(10) == nil)
a = {}; L = nil
local glob = 1
local oldglob = glob
debug.sethook(function (e,l)
collectgarbage() -- force GC during a hook
local f, m, c = debug.gethook()
assert(m == 'crl' and c == 0)
if e == "line" then
if glob ~= oldglob then
L = l-1 -- get the first line where "glob" has changed
oldglob = glob
end
elseif e == "call" then
local f = debug.getinfo(2, "f").func
a[f] = 1
else assert(e == "return")
end
end, "crl")
function f(a,b)
collectgarbage()
local _, x = debug.getlocal(1, 1)
local _, y = debug.getlocal(1, 2)
assert(x == a and y == b)
assert(debug.setlocal(2, 3, "pera") == "AA".."AA")
assert(debug.setlocal(2, 4, "maçã") == "B")
x = debug.getinfo(2)
assert(x.func == g and x.what == "Lua" and x.name == 'g' and
x.nups == 1 and string.find(x.source, "^@.*db%.lua$"))
glob = glob+1
assert(debug.getinfo(1, "l").currentline == L+1)
assert(debug.getinfo(1, "l").currentline == L+2)
end
function foo()
glob = glob+1
assert(debug.getinfo(1, "l").currentline == L+1)
end; foo() -- set L
-- check line counting inside strings and empty lines
_ = 'alo\
alo' .. [[
]]
--[[
]]
assert(debug.getinfo(1, "l").currentline == L+11) -- check count of lines
function g(...)
local arg = {...}
do local a,b,c; a=math.sin(40); end
local feijao
local AAAA,B = "xuxu", "mamão"
f(AAAA,B)
assert(AAAA == "pera" and B == "maçã")
do
local B = 13
local x,y = debug.getlocal(1,5)
assert(x == 'B' and y == 13)
end
end
g()
assert(a[f] and a[g] and a[assert] and a[debug.getlocal] and not a[print])
-- tests for manipulating non-registered locals (C and Lua temporaries)
local n, v = debug.getlocal(0, 1)
assert(v == 0 and n == "(*temporary)")
local n, v = debug.getlocal(0, 2)
assert(v == 2 and n == "(*temporary)")
assert(not debug.getlocal(0, 3))
assert(not debug.getlocal(0, 0))
function f()
assert(select(2, debug.getlocal(2,3)) == 1)
assert(not debug.getlocal(2,4))
debug.setlocal(2, 3, 10)
return 20
end
function g(a,b) return (a+1) + f() end
assert(g(0,0) == 30)
debug.sethook(nil);
assert(debug.gethook() == nil)
-- testing access to function arguments
X = nil
a = {}
function a:f (a, b, ...) local arg = {...}; local c = 13 end
debug.sethook(function (e)
assert(e == "call")
dostring("XX = 12") -- test dostring inside hooks
-- testing errors inside hooks
assert(not pcall(load("a='joao'+1")))
debug.sethook(function (e, l)
assert(debug.getinfo(2, "l").currentline == l)
local f,m,c = debug.gethook()
assert(e == "line")
assert(m == 'l' and c == 0)
debug.sethook(nil) -- hook is called only once
assert(not X) -- check that
X = {}; local i = 1
local x,y
while 1 do
x,y = debug.getlocal(2, i)
if x==nil then break end
X[x] = y
i = i+1
end
end, "l")
end, "c")
a:f(1,2,3,4,5)
assert(X.self == a and X.a == 1 and X.b == 2 and X.c == nil)
assert(XX == 12)
assert(debug.gethook() == nil)
-- testing upvalue access
local function getupvalues (f)
local t = {}
local i = 1
while true do
local name, value = debug.getupvalue(f, i)
if not name then break end
assert(not t[name])
t[name] = value
i = i + 1
end
return t
end
local a,b,c = 1,2,3
local function foo1 (a) b = a; return c end
local function foo2 (x) a = x; return c+b end
assert(debug.getupvalue(foo1, 3) == nil)
assert(debug.getupvalue(foo1, 0) == nil)
assert(debug.setupvalue(foo1, 3, "xuxu") == nil)
local t = getupvalues(foo1)
assert(t.a == nil and t.b == 2 and t.c == 3)
t = getupvalues(foo2)
assert(t.a == 1 and t.b == 2 and t.c == 3)
assert(debug.setupvalue(foo1, 1, "xuxu") == "b")
assert(({debug.getupvalue(foo2, 3)})[2] == "xuxu")
-- upvalues of C functions are allways "called" "" (the empty string)
assert(debug.getupvalue(string.gmatch("x", "x"), 1) == "")
-- testing count hooks
local a=0
debug.sethook(function (e) a=a+1 end, "", 1)
a=0; for i=1,1000 do end; assert(1000 < a and a < 1012)
debug.sethook(function (e) a=a+1 end, "", 4)
a=0; for i=1,1000 do end; assert(250 < a and a < 255)
local f,m,c = debug.gethook()
assert(m == "" and c == 4)
debug.sethook(function (e) a=a+1 end, "", 4000)
a=0; for i=1,1000 do end; assert(a == 0)
if not _no32 then
debug.sethook(print, "", 2^24 - 1) -- count upperbound
local f,m,c = debug.gethook()
assert(({debug.gethook()})[3] == 2^24 - 1)
end
debug.sethook()
-- tests for tail calls
local function f (x)
if x then
assert(debug.getinfo(1, "S").what == "Lua")
assert(debug.getinfo(1, "t").istailcall == true)
local tail = debug.getinfo(2)
assert(tail.func == g1 and tail.istailcall == true)
assert(debug.getinfo(3, "S").what == "main")
print"+"
end
end
function g(x) return f(x) end
function g1(x) g(x) end
local function h (x) local f=g1; return f(x) end
h(true)
local b = {}
debug.sethook(function (e) table.insert(b, e) end, "cr")
h(false)
debug.sethook()
local res = {"return", -- first return (from sethook)
"call", "tail call", "call", "tail call",
"return", "return",
"call", -- last call (to sethook)
}
for i = 1, #res do assert(res[i] == table.remove(b, 1)) end
b = 0
debug.sethook(function (e)
if e == "tail call" then
b = b + 1
assert(debug.getinfo(2, "t").istailcall == true)
else
assert(debug.getinfo(2, "t").istailcall == false)
end
end, "c")
h(false)
debug.sethook()
assert(b == 2) -- two tail calls
lim = 30000
if _soft then limit = 3000 end
local function foo (x)
if x==0 then
assert(debug.getinfo(2).what == "main")
local info = debug.getinfo(1)
assert(info.istailcall == true and info.func == foo)
else return foo(x-1)
end
end
foo(lim)
print"+"
-- testing local function information
co = load[[
local A = function ()
return x
end
return
]]
local a = 0
-- 'A' should be visible to debugger only after its complete definition
debug.sethook(function (e, l)
if l == 3 then a = a + 1; assert(debug.getlocal(2, 1) == "(*temporary)")
elseif l == 4 then a = a + 1; assert(debug.getlocal(2, 1) == "A")
end
end, "l")
co() -- run local function definition
debug.sethook() -- turn off hook
assert(a == 2) -- ensure all two lines where hooked
-- testing traceback
assert(debug.traceback(print) == print)
assert(debug.traceback(print, 4) == print)
assert(string.find(debug.traceback("hi", 4), "^hi\n"))
assert(string.find(debug.traceback("hi"), "^hi\n"))
assert(not string.find(debug.traceback("hi"), "'traceback'"))
assert(string.find(debug.traceback("hi", 0), "'traceback'"))
assert(string.find(debug.traceback(), "^stack traceback:\n"))
-- testing nparams, nups e isvararg
local t = debug.getinfo(print, "u")
assert(t.isvararg == true and t.nparams == 0 and t.nups == 0)
t = debug.getinfo(function (a,b,c) end, "u")
assert(t.isvararg == false and t.nparams == 3 and t.nups == 0)
t = debug.getinfo(function (a,b,...) return t[a] end, "u")
assert(t.isvararg == true and t.nparams == 2 and t.nups == 1)
t = debug.getinfo(1) -- main
assert(t.isvararg == true and t.nparams == 0 and t.nups == 1 and
debug.getupvalue(t.func, 1) == "_ENV")
-- testing debugging of coroutines
local function checktraceback (co, p, level)
local tb = debug.traceback(co, nil, level)
local i = 0
for l in string.gmatch(tb, "[^\n]+\n?") do
assert(i == 0 or string.find(l, p[i]))
i = i+1
end
assert(p[i] == nil)
end
local function f (n)
if n > 0 then f(n-1)
else coroutine.yield() end
end
local co = coroutine.create(f)
coroutine.resume(co, 3)
checktraceback(co, {"yield", "db.lua", "db.lua", "db.lua", "db.lua"})
checktraceback(co, {"db.lua", "db.lua", "db.lua", "db.lua"}, 1)
checktraceback(co, {"db.lua", "db.lua", "db.lua"}, 2)
checktraceback(co, {"db.lua"}, 4)
checktraceback(co, {}, 40)
co = coroutine.create(function (x)
local a = 1
coroutine.yield(debug.getinfo(1, "l"))
coroutine.yield(debug.getinfo(1, "l").currentline)
return a
end)
local tr = {}
local foo = function (e, l) if l then table.insert(tr, l) end end
debug.sethook(co, foo, "lcr")
local _, l = coroutine.resume(co, 10)
local x = debug.getinfo(co, 1, "lfLS")
assert(x.currentline == l.currentline and x.activelines[x.currentline])
assert(type(x.func) == "function")
for i=x.linedefined + 1, x.lastlinedefined do
assert(x.activelines[i])
x.activelines[i] = nil
end
assert(next(x.activelines) == nil) -- no 'extra' elements
assert(debug.getinfo(co, 2) == nil)
local a,b = debug.getlocal(co, 1, 1)
assert(a == "x" and b == 10)
a,b = debug.getlocal(co, 1, 2)
assert(a == "a" and b == 1)
debug.setlocal(co, 1, 2, "hi")
assert(debug.gethook(co) == foo)
assert(#tr == 2 and
tr[1] == l.currentline-1 and tr[2] == l.currentline)
a,b,c = pcall(coroutine.resume, co)
assert(a and b and c == l.currentline+1)
checktraceback(co, {"yield", "in function <"})
a,b = coroutine.resume(co)
assert(a and b == "hi")
assert(#tr == 4 and tr[4] == l.currentline+2)
assert(debug.gethook(co) == foo)
assert(debug.gethook() == nil)
checktraceback(co, {})
-- check traceback of suspended (or dead with error) coroutines
function f(i) if i==0 then error(i) else coroutine.yield(); f(i-1) end end
co = coroutine.create(function (x) f(x) end)
a, b = coroutine.resume(co, 3)
t = {"'yield'", "'f'", "in function <"}
while coroutine.status(co) == "suspended" do
checktraceback(co, t)
a, b = coroutine.resume(co)
table.insert(t, 2, "'f'") -- one more recursive call to 'f'
end
t[1] = "'error'"
checktraceback(co, t)
-- test acessing line numbers of a coroutine from a resume inside
-- a C function (this is a known bug in Lua 5.0)
local function g(x)
coroutine.yield(x)
end
local function f (i)
debug.sethook(function () end, "l")
for j=1,1000 do
g(i+j)
end
end
local co = coroutine.wrap(f)
co(10)
pcall(co)
pcall(co)
assert(type(debug.getregistry()) == "table")
-- test tagmethod information
local a = {}
local function f (t)
local info = debug.getinfo(1);
assert(info.namewhat == "metamethod")
a.op = info.name
return info.name
end
setmetatable(a, {
__index = f; __add = f; __div = f; __mod = f; __concat = f; __pow = f;
__eq = f; __le = f; __lt = f;
})
local b = setmetatable({}, getmetatable(a))
assert(a[3] == "__index" and a^3 == "__pow" and a..a == "__concat")
assert(a/3 == "__div" and 3%a == "__mod")
assert (a==b and a.op == "__eq")
assert (a>=b and a.op == "__le")
assert (a>b and a.op == "__lt")
print"OK"

Binary file not shown.

View File

@@ -0,0 +1,422 @@
print("testing errors")
local debug = require"debug"
-- avoid problems with 'strict' module (which may generate other error messages)
local mt = getmetatable(_G) or {}
local oldmm = mt.__index
mt.__index = nil
function doit (s)
local f, msg = load(s)
if f == nil then return msg end
local cond, msg = pcall(f)
return (not cond) and msg
end
function checkmessage (prog, msg)
local m = doit(prog)
assert(string.find(m, msg, 1, true))
end
function checksyntax (prog, extra, token, line)
local msg = doit(prog)
if not string.find(token, "^<%a") and not string.find(token, "^char%(")
then token = "'"..token.."'" end
token = string.gsub(token, "(%p)", "%%%1")
local pt = string.format([[^%%[string ".*"%%]:%d: .- near %s$]],
line, token)
assert(string.find(msg, pt))
assert(string.find(msg, msg, 1, true))
end
-- test error message with no extra info
assert(doit("error('hi', 0)") == 'hi')
-- test error message with no info
assert(doit("error()") == nil)
-- test common errors/errors that crashed in the past
if not _no32 then
assert(doit("table.unpack({}, 1, n=2^30)"))
end
assert(doit("a=math.sin()"))
assert(not doit("tostring(1)") and doit("tostring()"))
assert(doit"tonumber()")
assert(doit"repeat until 1; a")
assert(doit"return;;")
assert(doit"assert(false)")
assert(doit"assert(nil)")
assert(doit("function a (... , ...) end"))
assert(doit("function a (, ...) end"))
assert(doit("local t={}; t = t[#t] + 1"))
checksyntax([[
local a = {4
]], "'}' expected (to close '{' at line 1)", "<eof>", 3)
-- tests for better error messages
checkmessage("a=1; bbbb=2; a=math.sin(3)+bbbb(3)", "global 'bbbb'")
checkmessage("a=1; local a,bbbb=2,3; a = math.sin(1) and bbbb(3)",
"local 'bbbb'")
checkmessage("a={}; do local a=1 end a:bbbb(3)", "method 'bbbb'")
checkmessage("local a={}; a.bbbb(3)", "field 'bbbb'")
assert(not string.find(doit"a={13}; local bbbb=1; a[bbbb](3)", "'bbbb'"))
checkmessage("a={13}; local bbbb=1; a[bbbb](3)", "number")
checkmessage("a=(1)..{}", "a table value")
aaa = nil
checkmessage("aaa.bbb:ddd(9)", "global 'aaa'")
checkmessage("local aaa={bbb=1}; aaa.bbb:ddd(9)", "field 'bbb'")
checkmessage("local aaa={bbb={}}; aaa.bbb:ddd(9)", "method 'ddd'")
checkmessage("local a,b,c; (function () a = b+1 end)()", "upvalue 'b'")
assert(not doit"local aaa={bbb={ddd=next}}; aaa.bbb:ddd(nil)")
checkmessage("local _ENV = {x={}}; a = a + 1", "global 'a'")
checkmessage("b=1; local aaa='a'; x=aaa+b", "local 'aaa'")
checkmessage("aaa={}; x=3/aaa", "global 'aaa'")
checkmessage("aaa='2'; b=nil;x=aaa*b", "global 'b'")
checkmessage("aaa={}; x=-aaa", "global 'aaa'")
assert(not string.find(doit"aaa={}; x=(aaa or aaa)+(aaa and aaa)", "'aaa'"))
assert(not string.find(doit"aaa={}; (aaa or aaa)()", "'aaa'"))
checkmessage("print(print < 10)", "function")
checkmessage("print(print < print)", "two function")
-- passing light userdata instead of full userdata
_G.D = debug
checkmessage([[
-- create light udata
local x = D.upvalueid(function () return debug end, 1)
D.setuservalue(x, {})
]], "light userdata")
_G.D = nil
-- global functions
checkmessage("(io.write or print){}", "io.write")
checkmessage("(collectgarbage or print){}", "collectgarbage")
-- tests for field accesses after RK limit
local t = {}
for i = 1, 1000 do
t[i] = "a = x" .. i
end
local s = table.concat(t, "; ")
t = nil
checkmessage(s.."; a = bbb + 1", "global 'bbb'")
checkmessage("local _ENV=_ENV;"..s.."; a = bbb + 1", "global 'bbb'")
checkmessage(s.."; local t = {}; a = t.bbb + 1", "field 'bbb'")
checkmessage(s.."; local t = {}; t:bbb()", "method 'bbb'")
checkmessage([[aaa=9
repeat until 3==3
local x=math.sin(math.cos(3))
if math.sin(1) == x then return math.sin(1) end -- tail call
local a,b = 1, {
{x='a'..'b'..'c', y='b', z=x},
{1,2,3,4,5} or 3+3<=3+3,
3+1>3+1,
{d = x and aaa[x or y]}}
]], "global 'aaa'")
checkmessage([[
local x,y = {},1
if math.sin(1) == 0 then return 3 end -- return
x.a()]], "field 'a'")
checkmessage([[
prefix = nil
insert = nil
while 1 do
local a
if nil then break end
insert(prefix, a)
end]], "global 'insert'")
checkmessage([[ -- tail call
return math.sin("a")
]], "'sin'")
checkmessage([[collectgarbage("nooption")]], "invalid option")
checkmessage([[x = print .. "a"]], "concatenate")
checkmessage("getmetatable(io.stdin).__gc()", "no value")
checkmessage([[
local Var
local function main()
NoSuchName (function() Var=0 end)
end
main()
]], "global 'NoSuchName'")
print'+'
a = {}; setmetatable(a, {__index = string})
checkmessage("a:sub()", "bad self")
checkmessage("string.sub('a', {})", "#2")
checkmessage("('a'):sub{}", "#1")
checkmessage("table.sort({1,2,3}, table.sort)", "'table.sort'")
-- next message may be 'setmetatable' or '_G.setmetatable'
checkmessage("string.gsub('s', 's', setmetatable)", "setmetatable'")
-- tests for errors in coroutines
function f (n)
local c = coroutine.create(f)
local a,b = coroutine.resume(c)
return b
end
assert(string.find(f(), "C stack overflow"))
checkmessage("coroutine.yield()", "outside a coroutine")
f1 = function () table.sort({1,2,3}, coroutine.yield) end
f = coroutine.wrap(function () return pcall(f1) end)
assert(string.find(select(2, f()), "yield across"))
-- testing size of 'source' info; size of buffer for that info is
-- LUA_IDSIZE, declared as 60 in luaconf. Get one position for '\0'.
idsize = 60 - 1
local function checksize (source)
-- syntax error
local _, msg = load("x", source)
msg = string.match(msg, "^([^:]*):") -- get source (1st part before ':')
assert(msg:len() <= idsize)
end
for i = 60 - 10, 60 + 10 do -- check border cases around 60
checksize("@" .. string.rep("x", i)) -- file names
checksize(string.rep("x", i - 10)) -- string sources
checksize("=" .. string.rep("x", i)) -- exact sources
end
-- testing line error
local function lineerror (s, l)
local err,msg = pcall(load(s))
local line = string.match(msg, ":(%d+):")
assert((line and line+0) == l)
end
lineerror("local a\n for i=1,'a' do \n print(i) \n end", 2)
lineerror("\n local a \n for k,v in 3 \n do \n print(k) \n end", 3)
lineerror("\n\n for k,v in \n 3 \n do \n print(k) \n end", 4)
lineerror("function a.x.y ()\na=a+1\nend", 1)
lineerror("a = \na\n+\n{}", 3)
lineerror("a = \n3\n+\n(\n4\n/\nprint)", 6)
lineerror("a = \nprint\n+\n(\n4\n/\n7)", 3)
lineerror("a\n=\n-\n\nprint\n;", 3)
lineerror([[
a
(
23)
]], 1)
lineerror([[
local a = {x = 13}
a
.
x
(
23
)
]], 2)
lineerror([[
local a = {x = 13}
a
.
x
(
23 + a
)
]], 6)
local p = [[
function g() f() end
function f(x) error('a', X) end
g()
]]
X=3;lineerror((p), 3)
X=0;lineerror((p), nil)
X=1;lineerror((p), 2)
X=2;lineerror((p), 1)
if not _soft then
-- several tests that exaust the Lua stack
C = 0
local l = debug.getinfo(1, "l").currentline; function y () C=C+1; y() end
local function checkstackmessage (m)
return (string.find(m, "^.-:%d+: stack overflow"))
end
-- repeated stack overflows (to check stack recovery)
assert(checkstackmessage(doit('y()')))
print('+')
assert(checkstackmessage(doit('y()')))
print('+')
assert(checkstackmessage(doit('y()')))
print('+')
-- error lines in stack overflow
C = 0
local l1
local function g(x)
l1 = debug.getinfo(x, "l").currentline; y()
end
local _, stackmsg = xpcall(g, debug.traceback, 1)
print('+')
local stack = {}
for line in string.gmatch(stackmsg, "[^\n]*") do
local curr = string.match(line, ":(%d+):")
if curr then table.insert(stack, tonumber(curr)) end
end
local i=1
while stack[i] ~= l1 do
assert(stack[i] == l)
i = i+1
end
assert(i > 15)
-- error in error handling
local res, msg = xpcall(error, error)
assert(not res and type(msg) == 'string')
print('+')
local function f (x)
if x==0 then error('a\n')
else
local aux = function () return f(x-1) end
local a,b = xpcall(aux, aux)
return a,b
end
end
f(3)
local function loop (x,y,z) return 1 + loop(x, y, z) end
local res, msg = xpcall(loop, function (m)
assert(string.find(m, "stack overflow"))
local res, msg = pcall(loop)
assert(string.find(msg, "error handling"))
assert(math.sin(0) == 0)
return 15
end)
assert(msg == 15)
res, msg = pcall(function ()
for i = 999900, 1000000, 1 do table.unpack({}, 1, i) end
end)
assert(string.find(msg, "too many results"))
end
-- non string messages
function f() error{msg='x'} end
res, msg = xpcall(f, function (r) return {msg=r.msg..'y'} end)
assert(msg.msg == 'xy')
-- xpcall with arguments
a, b, c = xpcall(string.find, error, "alo", "al")
assert(a and b == 1 and c == 2)
a, b, c = xpcall(string.find, function (x) return {} end, true, "al")
assert(not a and type(b) == "table" and c == nil)
print('+')
checksyntax("syntax error", "", "error", 1)
checksyntax("1.000", "", "1.000", 1)
checksyntax("[[a]]", "", "[[a]]", 1)
checksyntax("'aa'", "", "'aa'", 1)
-- test 255 as first char in a chunk
checksyntax("\255a = 1", "", "char(255)", 1)
doit('I = load("a=9+"); a=3')
assert(a==3 and I == nil)
print('+')
lim = 1000
if _soft then lim = 100 end
for i=1,lim do
doit('a = ')
doit('a = 4+nil')
end
-- testing syntax limits
local function testrep (init, rep)
local s = "local a; "..init .. string.rep(rep, 400)
local a,b = load(s)
assert(not a and string.find(b, "levels"))
end
testrep("a=", "{")
testrep("a=", "(")
testrep("", "a(")
testrep("", "do ")
testrep("", "while a do ")
testrep("", "if a then else ")
testrep("", "function foo () ")
testrep("a=", "a..")
testrep("a=", "a^")
local s = ("a,"):rep(200).."a=nil"
local a,b = load(s)
assert(not a and string.find(b, "levels"))
-- testing other limits
-- upvalues
local lim = 127
local s = "local function fooA ()\n local "
for j = 1,lim do
s = s.."a"..j..", "
end
s = s.."b,c\n"
s = s.."local function fooB ()\n local "
for j = 1,lim do
s = s.."b"..j..", "
end
s = s.."b\n"
s = s.."function fooC () return b+c"
local c = 1+2
for j = 1,lim do
s = s.."+a"..j.."+b"..j
c = c + 2
end
s = s.."\nend end end"
local a,b = load(s)
assert(c > 255 and string.find(b, "too many upvalues") and
string.find(b, "line 5"))
-- local variables
s = "\nfunction foo ()\n local "
for j = 1,300 do
s = s.."a"..j..", "
end
s = s.."b\n"
local a,b = load(s)
assert(string.find(b, "line 2"))
mt.__index = oldmm
print('OK')

Binary file not shown.

View File

@@ -0,0 +1,388 @@
print('testing metatables')
X = 20; B = 30
_ENV = setmetatable({}, {__index=_G})
collectgarbage()
X = X+10
assert(X == 30 and _G.X == 20)
B = false
assert(B == false)
B = nil
assert(B == 30)
assert(getmetatable{} == nil)
assert(getmetatable(4) == nil)
assert(getmetatable(nil) == nil)
a={}; setmetatable(a, {__metatable = "xuxu",
__tostring=function(x) return x.name end})
assert(getmetatable(a) == "xuxu")
assert(tostring(a) == nil)
-- cannot change a protected metatable
assert(pcall(setmetatable, a, {}) == false)
a.name = "gororoba"
assert(tostring(a) == "gororoba")
local a, t = {10,20,30; x="10", y="20"}, {}
assert(setmetatable(a,t) == a)
assert(getmetatable(a) == t)
assert(setmetatable(a,nil) == a)
assert(getmetatable(a) == nil)
assert(setmetatable(a,t) == a)
function f (t, i, e)
assert(not e)
local p = rawget(t, "parent")
return (p and p[i]+3), "dummy return"
end
t.__index = f
a.parent = {z=25, x=12, [4] = 24}
assert(a[1] == 10 and a.z == 28 and a[4] == 27 and a.x == "10")
collectgarbage()
a = setmetatable({}, t)
function f(t, i, v) rawset(t, i, v-3) end
setmetatable(t, t) -- causes a bug in 5.1 !
t.__newindex = f
a[1] = 30; a.x = "101"; a[5] = 200
assert(a[1] == 27 and a.x == 98 and a[5] == 197)
local c = {}
a = setmetatable({}, t)
t.__newindex = c
a[1] = 10; a[2] = 20; a[3] = 90
assert(c[1] == 10 and c[2] == 20 and c[3] == 90)
do
local a;
a = setmetatable({}, {__index = setmetatable({},
{__index = setmetatable({},
{__index = function (_,n) return a[n-3]+4, "lixo" end})})})
a[0] = 20
for i=0,10 do
assert(a[i*3] == 20 + i*4)
end
end
do -- newindex
local foi
local a = {}
for i=1,10 do a[i] = 0; a['a'..i] = 0; end
setmetatable(a, {__newindex = function (t,k,v) foi=true; rawset(t,k,v) end})
foi = false; a[1]=0; assert(not foi)
foi = false; a['a1']=0; assert(not foi)
foi = false; a['a11']=0; assert(foi)
foi = false; a[11]=0; assert(foi)
foi = false; a[1]=nil; assert(not foi)
foi = false; a[1]=nil; assert(foi)
end
setmetatable(t, nil)
function f (t, ...) return t, {...} end
t.__call = f
do
local x,y = a(table.unpack{'a', 1})
assert(x==a and y[1]=='a' and y[2]==1 and y[3]==nil)
x,y = a()
assert(x==a and y[1]==nil)
end
local b = setmetatable({}, t)
setmetatable(b,t)
function f(op)
return function (...) cap = {[0] = op, ...} ; return (...) end
end
t.__add = f("add")
t.__sub = f("sub")
t.__mul = f("mul")
t.__div = f("div")
t.__mod = f("mod")
t.__unm = f("unm")
t.__pow = f("pow")
t.__len = f("len")
assert(b+5 == b)
assert(cap[0] == "add" and cap[1] == b and cap[2] == 5 and cap[3]==nil)
assert(b+'5' == b)
assert(cap[0] == "add" and cap[1] == b and cap[2] == '5' and cap[3]==nil)
assert(5+b == 5)
assert(cap[0] == "add" and cap[1] == 5 and cap[2] == b and cap[3]==nil)
assert('5'+b == '5')
assert(cap[0] == "add" and cap[1] == '5' and cap[2] == b and cap[3]==nil)
b=b-3; assert(getmetatable(b) == t)
assert(5-a == 5)
assert(cap[0] == "sub" and cap[1] == 5 and cap[2] == a and cap[3]==nil)
assert('5'-a == '5')
assert(cap[0] == "sub" and cap[1] == '5' and cap[2] == a and cap[3]==nil)
assert(a*a == a)
assert(cap[0] == "mul" and cap[1] == a and cap[2] == a and cap[3]==nil)
assert(a/0 == a)
assert(cap[0] == "div" and cap[1] == a and cap[2] == 0 and cap[3]==nil)
assert(a%2 == a)
assert(cap[0] == "mod" and cap[1] == a and cap[2] == 2 and cap[3]==nil)
assert(-a == a)
assert(cap[0] == "unm" and cap[1] == a)
assert(a^4 == a)
assert(cap[0] == "pow" and cap[1] == a and cap[2] == 4 and cap[3]==nil)
assert(a^'4' == a)
assert(cap[0] == "pow" and cap[1] == a and cap[2] == '4' and cap[3]==nil)
assert(4^a == 4)
assert(cap[0] == "pow" and cap[1] == 4 and cap[2] == a and cap[3]==nil)
assert('4'^a == '4')
assert(cap[0] == "pow" and cap[1] == '4' and cap[2] == a and cap[3]==nil)
assert(#a == a)
assert(cap[0] == "len" and cap[1] == a)
-- test for rawlen
t = setmetatable({1,2,3}, {__len = function () return 10 end})
assert(#t == 10 and rawlen(t) == 3)
assert(rawlen"abc" == 3)
assert(not pcall(rawlen, io.stdin))
assert(not pcall(rawlen, 34))
assert(not pcall(rawlen))
t = {}
t.__lt = function (a,b,c)
collectgarbage()
assert(c == nil)
if type(a) == 'table' then a = a.x end
if type(b) == 'table' then b = b.x end
return a<b, "dummy"
end
function Op(x) return setmetatable({x=x}, t) end
local function test ()
assert(not(Op(1)<Op(1)) and (Op(1)<Op(2)) and not(Op(2)<Op(1)))
assert(not(1 < Op(1)) and (Op(1) < 2) and not(2 < Op(1)))
assert(not(Op('a')<Op('a')) and (Op('a')<Op('b')) and not(Op('b')<Op('a')))
assert(not('a' < Op('a')) and (Op('a') < 'b') and not(Op('b') < Op('a')))
assert((Op(1)<=Op(1)) and (Op(1)<=Op(2)) and not(Op(2)<=Op(1)))
assert((Op('a')<=Op('a')) and (Op('a')<=Op('b')) and not(Op('b')<=Op('a')))
assert(not(Op(1)>Op(1)) and not(Op(1)>Op(2)) and (Op(2)>Op(1)))
assert(not(Op('a')>Op('a')) and not(Op('a')>Op('b')) and (Op('b')>Op('a')))
assert((Op(1)>=Op(1)) and not(Op(1)>=Op(2)) and (Op(2)>=Op(1)))
assert((1 >= Op(1)) and not(1 >= Op(2)) and (Op(2) >= 1))
assert((Op('a')>=Op('a')) and not(Op('a')>=Op('b')) and (Op('b')>=Op('a')))
assert(('a' >= Op('a')) and not(Op('a') >= 'b') and (Op('b') >= Op('a')))
end
test()
t.__le = function (a,b,c)
assert(c == nil)
if type(a) == 'table' then a = a.x end
if type(b) == 'table' then b = b.x end
return a<=b, "dummy"
end
test() -- retest comparisons, now using both `lt' and `le'
-- test `partial order'
local function Set(x)
local y = {}
for _,k in pairs(x) do y[k] = 1 end
return setmetatable(y, t)
end
t.__lt = function (a,b)
for k in pairs(a) do
if not b[k] then return false end
b[k] = nil
end
return next(b) ~= nil
end
t.__le = nil
assert(Set{1,2,3} < Set{1,2,3,4})
assert(not(Set{1,2,3,4} < Set{1,2,3,4}))
assert((Set{1,2,3,4} <= Set{1,2,3,4}))
assert((Set{1,2,3,4} >= Set{1,2,3,4}))
assert((Set{1,3} <= Set{3,5})) -- wrong!! model needs a `le' method ;-)
t.__le = function (a,b)
for k in pairs(a) do
if not b[k] then return false end
end
return true
end
assert(not (Set{1,3} <= Set{3,5})) -- now its OK!
assert(not(Set{1,3} <= Set{3,5}))
assert(not(Set{1,3} >= Set{3,5}))
t.__eq = function (a,b)
for k in pairs(a) do
if not b[k] then return false end
b[k] = nil
end
return next(b) == nil
end
local s = Set{1,3,5}
assert(s == Set{3,5,1})
assert(not rawequal(s, Set{3,5,1}))
assert(rawequal(s, s))
assert(Set{1,3,5,1} == Set{3,5,1})
assert(Set{1,3,5} ~= Set{3,5,1,6})
t[Set{1,3,5}] = 1
assert(t[Set{1,3,5}] == nil) -- `__eq' is not valid for table accesses
t.__concat = function (a,b,c)
assert(c == nil)
if type(a) == 'table' then a = a.val end
if type(b) == 'table' then b = b.val end
if A then return a..b
else
return setmetatable({val=a..b}, t)
end
end
c = {val="c"}; setmetatable(c, t)
d = {val="d"}; setmetatable(d, t)
A = true
assert(c..d == 'cd')
assert(0 .."a".."b"..c..d.."e".."f"..(5+3).."g" == "0abcdef8g")
A = false
assert((c..d..c..d).val == 'cdcd')
x = c..d
assert(getmetatable(x) == t and x.val == 'cd')
x = 0 .."a".."b"..c..d.."e".."f".."g"
assert(x.val == "0abcdefg")
-- concat metamethod x numbers (bug in 5.1.1)
c = {}
local x
setmetatable(c, {__concat = function (a,b)
assert(type(a) == "number" and b == c or type(b) == "number" and a == c)
return c
end})
assert(c..5 == c and 5 .. c == c)
assert(4 .. c .. 5 == c and 4 .. 5 .. 6 .. 7 .. c == c)
-- test comparison compatibilities
local t1, t2, c, d
t1 = {}; c = {}; setmetatable(c, t1)
d = {}
t1.__eq = function () return true end
t1.__lt = function () return true end
setmetatable(d, t1)
assert(c == d and c < d and not(d <= c))
t2 = {}
t2.__eq = t1.__eq
t2.__lt = t1.__lt
setmetatable(d, t2)
assert(c == d and c < d and not(d <= c))
-- test for several levels of calls
local i
local tt = {
__call = function (t, ...)
i = i+1
if t.f then return t.f(...)
else return {...}
end
end
}
local a = setmetatable({}, tt)
local b = setmetatable({f=a}, tt)
local c = setmetatable({f=b}, tt)
i = 0
x = c(3,4,5)
assert(i == 3 and x[1] == 3 and x[3] == 5)
assert(_G.X == 20)
print'+'
local _g = _G
_ENV = setmetatable({}, {__index=function (_,k) return _g[k] end})
a = {}
rawset(a, "x", 1, 2, 3)
assert(a.x == 1 and rawget(a, "x", 3) == 1)
print '+'
-- testing metatables for basic types
local debug = require'debug'
mt = {}
debug.setmetatable(10, mt)
assert(getmetatable(-2) == mt)
mt.__index = function (a,b) return a+b end
assert((10)[3] == 13)
assert((10)["3"] == 13)
debug.setmetatable(23, nil)
assert(getmetatable(-2) == nil)
debug.setmetatable(true, mt)
assert(getmetatable(false) == mt)
mt.__index = function (a,b) return a or b end
assert((true)[false] == true)
assert((false)[false] == false)
debug.setmetatable(false, nil)
assert(getmetatable(true) == nil)
debug.setmetatable(nil, mt)
assert(getmetatable(nil) == mt)
mt.__add = function (a,b) return (a or 0) + (b or 0) end
assert(10 + nil == 10)
assert(nil + 23 == 23)
assert(nil + nil == 0)
debug.setmetatable(nil, nil)
assert(getmetatable(nil) == nil)
debug.setmetatable(nil, {})
-- loops in delegation
a = {}; setmetatable(a, a); a.__index = a; a.__newindex = a
assert(not pcall(function (a,b) return a[b] end, a, 10))
assert(not pcall(function (a,b,c) a[b] = c end, a, 10, true))
-- bug in 5.1
T, K, V = nil
grandparent = {}
grandparent.__newindex = function(t,k,v) T=t; K=k; V=v end
parent = {}
parent.__newindex = parent
setmetatable(parent, grandparent)
child = setmetatable({}, parent)
child.foo = 10 --> CRASH (on some machines)
assert(T == parent and K == "foo" and V == 10)
print 'OK'
return 12

Binary file not shown.

View File

@@ -0,0 +1,605 @@
debug = require "debug"
assert(type(os.getenv"PATH") == "string")
assert(io.input(io.stdin) == io.stdin)
assert(not pcall(io.input, "non-existent-file"))
assert(io.output(io.stdout) == io.stdout)
-- cannot close standard files
assert(not io.close(io.stdin) and
not io.stdout:close() and
not io.stderr:close())
assert(type(io.input()) == "userdata" and io.type(io.output()) == "file")
assert(type(io.stdin) == "userdata" and io.type(io.stderr) == "file")
assert(io.type(8) == nil)
local a = {}; setmetatable(a, {})
assert(io.type(a) == nil)
local a,b,c = io.open('xuxu_nao_existe')
assert(not a and type(b) == "string" and type(c) == "number")
a,b,c = io.open('/a/b/c/d', 'w')
assert(not a and type(b) == "string" and type(c) == "number")
local file = os.tmpname()
local f, msg = io.open(file, "w")
if not f then
(Message or print)("'os.tmpname' file cannot be open; skipping file tests")
else --{ most tests here need tmpname
f:close()
print('testing i/o')
local otherfile = os.tmpname()
assert(not pcall(io.open, file, "rw")) -- invalid mode
assert(not pcall(io.open, file, "rb+")) -- invalid mode
assert(not pcall(io.open, file, "r+bk")) -- invalid mode
assert(not pcall(io.open, file, "")) -- invalid mode
assert(not pcall(io.open, file, "+")) -- invalid mode
assert(not pcall(io.open, file, "b")) -- invalid mode
assert(io.open(file, "r+b")):close()
assert(io.open(file, "r+")):close()
assert(io.open(file, "rb")):close()
assert(os.setlocale('C', 'all'))
io.input(io.stdin); io.output(io.stdout);
os.remove(file)
assert(loadfile(file) == nil)
assert(io.open(file) == nil)
io.output(file)
assert(io.output() ~= io.stdout)
assert(io.output():seek() == 0)
assert(io.write("alo alo"):seek() == string.len("alo alo"))
assert(io.output():seek("cur", -3) == string.len("alo alo")-3)
assert(io.write("joao"))
assert(io.output():seek("end") == string.len("alo joao"))
assert(io.output():seek("set") == 0)
assert(io.write('"álo"', "{a}\n", "second line\n", "third line \n"))
assert(io.write('çfourth_line'))
io.output(io.stdout)
collectgarbage() -- file should be closed by GC
assert(io.input() == io.stdin and rawequal(io.output(), io.stdout))
print('+')
-- test GC for files
collectgarbage()
for i=1,120 do
for i=1,5 do
io.input(file)
assert(io.open(file, 'r'))
io.lines(file)
end
collectgarbage()
end
io.input():close()
io.close()
assert(os.rename(file, otherfile))
assert(os.rename(file, otherfile) == nil)
io.output(io.open(otherfile, "ab"))
assert(io.write("\n\n\t\t 3450\n"));
io.close()
-- test line generators
assert(not pcall(io.lines, "non-existent-file"))
assert(os.rename(otherfile, file))
io.output(otherfile)
local f = io.lines(file)
while f() do end;
assert(not pcall(f)) -- read lines after EOF
assert(not pcall(f)) -- read lines after EOF
-- copy from file to otherfile
for l in io.lines(file) do io.write(l, "\n") end
io.close()
-- copy from otherfile back to file
local f = assert(io.open(otherfile))
assert(io.type(f) == "file")
io.output(file)
assert(io.output():read() == nil)
for l in f:lines() do io.write(l, "\n") end
assert(tostring(f):sub(1, 5) == "file ")
assert(f:close()); io.close()
assert(not pcall(io.close, f)) -- error trying to close again
assert(tostring(f) == "file (closed)")
assert(io.type(f) == "closed file")
io.input(file)
f = io.open(otherfile):lines()
for l in io.lines() do assert(l == f()) end
f = nil; collectgarbage()
assert(os.remove(otherfile))
io.input(file)
do -- test error returns
local a,b,c = io.input():write("xuxu")
assert(not a and type(b) == "string" and type(c) == "number")
end
assert(io.read(0) == "") -- not eof
assert(io.read(5, '*l') == '"álo"')
assert(io.read(0) == "")
assert(io.read() == "second line")
local x = io.input():seek()
assert(io.read() == "third line ")
assert(io.input():seek("set", x))
assert(io.read('*L') == "third line \n")
assert(io.read(1) == "ç")
assert(io.read(string.len"fourth_line") == "fourth_line")
assert(io.input():seek("cur", -string.len"fourth_line"))
assert(io.read() == "fourth_line")
assert(io.read() == "") -- empty line
assert(io.read('*n') == 3450)
assert(io.read(1) == '\n')
assert(io.read(0) == nil) -- end of file
assert(io.read(1) == nil) -- end of file
assert(io.read(30000) == nil) -- end of file
assert(({io.read(1)})[2] == nil)
assert(io.read() == nil) -- end of file
assert(({io.read()})[2] == nil)
assert(io.read('*n') == nil) -- end of file
assert(({io.read('*n')})[2] == nil)
assert(io.read('*a') == '') -- end of file (OK for `*a')
assert(io.read('*a') == '') -- end of file (OK for `*a')
collectgarbage()
print('+')
io.close(io.input())
assert(not pcall(io.read))
assert(os.remove(file))
local t = '0123456789'
for i=1,12 do t = t..t; end
assert(string.len(t) == 10*2^12)
io.output(file)
io.write("alo"):write("\n")
io.close()
assert(not pcall(io.write))
local f = io.open(file, "a+b")
io.output(f)
collectgarbage()
assert(io.write(' ' .. t .. ' '))
assert(io.write(';', 'end of file\n'))
f:flush(); io.flush()
f:close()
print('+')
io.input(file)
assert(io.read() == "alo")
assert(io.read(1) == ' ')
assert(io.read(string.len(t)) == t)
assert(io.read(1) == ' ')
assert(io.read(0))
assert(io.read('*a') == ';end of file\n')
assert(io.read(0) == nil)
assert(io.close(io.input()))
-- test errors in read/write
do
local function ismsg (m)
-- error message is not a code number
return (type(m) == "string" and tonumber(m) == nil)
end
-- read
local f = io.open(file, "w")
local r, m, c = f:read()
assert(r == nil and ismsg(m) and type(c) == "number")
assert(f:close())
-- write
f = io.open(file, "r")
r, m, c = f:write("whatever")
assert(r == nil and ismsg(m) and type(c) == "number")
assert(f:close())
-- lines
f = io.open(file, "w")
r, m = pcall(f:lines())
assert(r == false and ismsg(m))
assert(f:close())
end
assert(os.remove(file))
-- test for *L format
io.output(file); io.write"\n\nline\nother":close()
io.input(file)
assert(io.read"*L" == "\n")
assert(io.read"*L" == "\n")
assert(io.read"*L" == "line\n")
assert(io.read"*L" == "other")
assert(io.read"*L" == nil)
io.input():close()
local f = assert(io.open(file))
local s = ""
for l in f:lines("*L") do s = s .. l end
assert(s == "\n\nline\nother")
f:close()
io.input(file)
s = ""
for l in io.lines(nil, "*L") do s = s .. l end
assert(s == "\n\nline\nother")
io.input():close()
s = ""
for l in io.lines(file, "*L") do s = s .. l end
assert(s == "\n\nline\nother")
s = ""
for l in io.lines(file, "*l") do s = s .. l end
assert(s == "lineother")
io.output(file); io.write"a = 10 + 34\na = 2*a\na = -a\n":close()
local t = {}
load(io.lines(file, "*L"), nil, nil, t)()
assert(t.a == -((10 + 34) * 2))
-- test for multipe arguments in 'lines'
io.output(file); io.write"0123456789\n":close()
for a,b in io.lines(file, 1, 1) do
if a == "\n" then assert(b == nil)
else assert(tonumber(a) == b - 1)
end
end
for a,b,c in io.lines(file, 1, 2, "*a") do
assert(a == "0" and b == "12" and c == "3456789\n")
end
for a,b,c in io.lines(file, "*a", 0, 1) do
if a == "" then break end
assert(a == "0123456789\n" and b == nil and c == nil)
end
collectgarbage() -- to close file in previous iteration
io.output(file); io.write"00\n10\n20\n30\n40\n":close()
for a, b in io.lines(file, "*n", "*n") do
if a == 40 then assert(b == nil)
else assert(a == b - 10)
end
end
-- test load x lines
io.output(file);
io.write[[
local y
= X
X =
X *
2 +
X;
X =
X
- y;
]]:close()
_G.X = 1
assert(not load(io.lines(file)))
collectgarbage() -- to close file in previous iteration
load(io.lines(file, "*L"))()
assert(_G.X == 2)
load(io.lines(file, 1))()
assert(_G.X == 4)
load(io.lines(file, 3))()
assert(_G.X == 8)
print('+')
local x1 = "string\n\n\\com \"\"''coisas [[estranhas]] ]]'"
io.output(file)
assert(io.write(string.format("x2 = %q\n-- comment without ending EOS", x1)))
io.close()
assert(loadfile(file))()
assert(x1 == x2)
print('+')
assert(os.remove(file))
assert(os.remove(file) == nil)
assert(os.remove(otherfile) == nil)
-- testing loadfile
local function testloadfile (s, expres)
io.output(file)
if s then io.write(s) end
io.close()
local res = assert(loadfile(file))()
assert(os.remove(file))
assert(res == expres)
end
-- loading empty file
testloadfile(nil, nil)
-- loading file with initial comment without end of line
testloadfile("# a non-ending comment", nil)
-- checking Unicode BOM in files
testloadfile("\xEF\xBB\xBF# some comment\nreturn 234", 234)
testloadfile("\xEF\xBB\xBFreturn 239", 239)
testloadfile("\xEF\xBB\xBF", nil) -- empty file with a BOM
-- checking line numbers in files with initial comments
testloadfile("# a comment\nreturn debug.getinfo(1).currentline", 2)
-- loading binary file
io.output(io.open(file, "wb"))
assert(io.write(string.dump(function () return 10, '\0alo\255', 'hi' end)))
io.close()
a, b, c = assert(loadfile(file))()
assert(a == 10 and b == "\0alo\255" and c == "hi")
assert(os.remove(file))
-- loading binary file with initial comment
io.output(io.open(file, "wb"))
assert(io.write("#this is a comment for a binary file\0\n",
string.dump(function () return 20, '\0\0\0' end)))
io.close()
a, b, c = assert(loadfile(file))()
assert(a == 20 and b == "\0\0\0" and c == nil)
assert(os.remove(file))
-- 'loadfile' with 'env'
do
local f = io.open(file, 'w')
f:write[[
if (...) then a = 15; return b, c, d
else return _ENV
end
]]
f:close()
local t = {b = 12, c = "xuxu", d = print}
local f = assert(loadfile(file, 't', t))
local b, c, d = f(1)
assert(t.a == 15 and b == 12 and c == t.c and d == print)
assert(f() == t)
f = assert(loadfile(file, 't', nil))
assert(f() == nil)
f = assert(loadfile(file))
assert(f() == _G)
assert(os.remove(file))
end
-- 'loadfile' x modes
do
io.open(file, 'w'):write("return 10"):close()
local s, m = loadfile(file, 'b')
assert(not s and string.find(m, "a text chunk"))
io.open(file, 'w'):write("\27 return 10"):close()
local s, m = loadfile(file, 't')
assert(not s and string.find(m, "a binary chunk"))
assert(os.remove(file))
end
io.output(file)
assert(io.write("qualquer coisa\n"))
assert(io.write("mais qualquer coisa"))
io.close()
assert(io.output(assert(io.open(otherfile, 'wb')))
:write("outra coisa\0\1\3\0\0\0\0\255\0")
:close())
local filehandle = assert(io.open(file, 'r+'))
local otherfilehandle = assert(io.open(otherfile, 'rb'))
assert(filehandle ~= otherfilehandle)
assert(type(filehandle) == "userdata")
assert(filehandle:read('*l') == "qualquer coisa")
io.input(otherfilehandle)
assert(io.read(string.len"outra coisa") == "outra coisa")
assert(filehandle:read('*l') == "mais qualquer coisa")
filehandle:close();
assert(type(filehandle) == "userdata")
io.input(otherfilehandle)
assert(io.read(4) == "\0\1\3\0")
assert(io.read(3) == "\0\0\0")
assert(io.read(0) == "") -- 255 is not eof
assert(io.read(1) == "\255")
assert(io.read('*a') == "\0")
assert(not io.read(0))
assert(otherfilehandle == io.input())
otherfilehandle:close()
assert(os.remove(file))
assert(os.remove(otherfile))
collectgarbage()
io.output(file)
:write[[
123.4 -56e-2 not a number
second line
third line
and the rest of the file
]]
:close()
io.input(file)
local _,a,b,c,d,e,h,__ = io.read(1, '*n', '*n', '*l', '*l', '*l', '*a', 10)
assert(io.close(io.input()))
assert(_ == ' ' and __ == nil)
assert(type(a) == 'number' and a==123.4 and b==-56e-2)
assert(d=='second line' and e=='third line')
assert(h==[[
and the rest of the file
]])
assert(os.remove(file))
collectgarbage()
-- testing buffers
do
local f = assert(io.open(file, "w"))
local fr = assert(io.open(file, "r"))
assert(f:setvbuf("full", 2000))
f:write("x")
assert(fr:read("*all") == "") -- full buffer; output not written yet
f:close()
fr:seek("set")
assert(fr:read("*all") == "x") -- `close' flushes it
f = assert(io.open(file), "w")
assert(f:setvbuf("no"))
f:write("x")
fr:seek("set")
assert(fr:read("*all") == "x") -- no buffer; output is ready
f:close()
f = assert(io.open(file, "a"))
assert(f:setvbuf("line"))
f:write("x")
fr:seek("set", 1)
assert(fr:read("*all") == "") -- line buffer; no output without `\n'
f:write("a\n"):seek("set", 1)
assert(fr:read("*all") == "xa\n") -- now we have a whole line
f:close(); fr:close()
assert(os.remove(file))
end
if not _soft then
print("testing large files (> BUFSIZ)")
io.output(file)
for i=1,5001 do io.write('0123456789123') end
io.write('\n12346'):close()
io.input(file)
local x = io.read('*a')
io.input():seek('set', 0)
local y = io.read(30001)..io.read(1005)..io.read(0)..
io.read(1)..io.read(100003)
assert(x == y and string.len(x) == 5001*13 + 6)
io.input():seek('set', 0)
y = io.read() -- huge line
assert(x == y..'\n'..io.read())
assert(io.read() == nil)
io.close(io.input())
assert(os.remove(file))
x = nil; y = nil
end
if not _noposix then
print("testing popen/pclose and execute")
local tests = {
-- command, what, code
{"ls > /dev/null", "ok"},
{"not-to-be-found-command", "exit"},
{"exit 3", "exit", 3},
{"exit 129", "exit", 129},
{"kill -s HUP $$", "signal", 1},
{"kill -s KILL $$", "signal", 9},
{"sh -c 'kill -s HUP $$'", "exit"},
{'lua -e "os.exit(20, true)"', "exit", 20},
}
print("\n(some error messages are expected now)")
for _, v in ipairs(tests) do
local x, y, z = io.popen(v[1]):close()
local x1, y1, z1 = os.execute(v[1])
assert(x == x1 and y == y1 and z == z1)
if v[2] == "ok" then
assert(x == true and y == 'exit' and z == 0)
else
assert(x == nil and y == v[2]) -- correct status and 'what'
-- correct code if known (but always different from 0)
assert((v[3] == nil and z > 0) or v[3] == z)
end
end
end
-- testing tmpfile
f = io.tmpfile()
assert(io.type(f) == "file")
f:write("alo")
f:seek("set")
assert(f:read"*a" == "alo")
end --}
print'+'
assert(os.date("") == "")
assert(os.date("!") == "")
local x = string.rep("a", 10000)
assert(os.date(x) == x)
local t = os.time()
T = os.date("*t", t)
assert(os.date(string.rep("%d", 1000), t) ==
string.rep(os.date("%d", t), 1000))
assert(os.date(string.rep("%", 200)) == string.rep("%", 100))
local t = os.time()
T = os.date("*t", t)
load(os.date([[assert(T.year==%Y and T.month==%m and T.day==%d and
T.hour==%H and T.min==%M and T.sec==%S and
T.wday==%w+1 and T.yday==%j and type(T.isdst) == 'boolean')]], t))()
assert(not pcall(os.date, "%9")) -- invalid conversion specifier
assert(not pcall(os.date, "%")) -- invalid conversion specifier
assert(not pcall(os.date, "%O")) -- invalid conversion specifier
assert(not pcall(os.date, "%E")) -- invalid conversion specifier
assert(not pcall(os.date, "%Ea")) -- invalid conversion specifier
if not _noposix then
assert(type(os.date("%Ex")) == 'string')
assert(type(os.date("%Oy")) == 'string')
end
assert(os.time(T) == t)
assert(not pcall(os.time, {hour = 12}))
T = os.date("!*t", t)
load(os.date([[!assert(T.year==%Y and T.month==%m and T.day==%d and
T.hour==%H and T.min==%M and T.sec==%S and
T.wday==%w+1 and T.yday==%j and type(T.isdst) == 'boolean')]], t))()
do
local T = os.date("*t")
local t = os.time(T)
assert(type(T.isdst) == 'boolean')
T.isdst = nil
local t1 = os.time(T)
assert(t == t1) -- if isdst is absent uses correct default
end
t = os.time(T)
T.year = T.year-1;
local t1 = os.time(T)
-- allow for leap years
assert(math.abs(os.difftime(t,t1)/(24*3600) - 365) < 2)
t = os.time()
t1 = os.time(os.date("*t"))
assert(os.difftime(t1,t) <= 2)
local t1 = os.time{year=2000, month=10, day=1, hour=23, min=12}
local t2 = os.time{year=2000, month=10, day=1, hour=23, min=10, sec=19}
assert(os.difftime(t1,t2) == 60*2-19)
io.output(io.stdout)
local d = os.date('%d')
local m = os.date('%m')
local a = os.date('%Y')
local ds = os.date('%w') + 1
local h = os.date('%H')
local min = os.date('%M')
local s = os.date('%S')
io.write(string.format('test done on %2.2d/%2.2d/%d', d, m, a))
io.write(string.format(', at %2.2d:%2.2d:%2.2d\n', h, min, s))
io.write(string.format('%s\n', _VERSION))

Binary file not shown.

View File

@@ -0,0 +1,574 @@
print('testing garbage collection')
collectgarbage()
assert(collectgarbage("isrunning"))
local function gcinfo () return collectgarbage"count" * 1024 end
-- test weird parameters
do
-- save original parameters
local a = collectgarbage("setpause", 200)
local b = collectgarbage("setstepmul", 200)
local t = {0, 2, 10, 90, 100, 500, 5000, 30000}
for i = 1, #t do
local p = t[i]
for j = 1, #t do
local m = t[j]
collectgarbage("setpause", p)
collectgarbage("setstepmul", m)
collectgarbage("step", 0)
collectgarbage("step", 10000)
end
end
-- restore original parameters
collectgarbage("setpause", a)
collectgarbage("setstepmul", b)
end
_G["while"] = 234
limit = 5000
local function GC1 ()
local u
local b -- must be declared after 'u' (to be above it in the stack)
local finish = false
u = setmetatable({}, {__gc = function () finish = true end})
b = {34}
repeat u = {} until finish
assert(b[1] == 34) -- 'u' was collected, but 'b' was not
finish = false; local i = 1
u = setmetatable({}, {__gc = function () finish = true end})
repeat i = i + 1; u = i .. i until finish
assert(b[1] == 34) -- 'u' was collected, but 'b' was not
finish = false
u = setmetatable({}, {__gc = function () finish = true end})
repeat local i; u = function () return i end until finish
assert(b[1] == 34) -- 'u' was collected, but 'b' was not
end
local function GC() GC1(); GC1() end
contCreate = 0
print('tables')
while contCreate <= limit do
local a = {}; a = nil
contCreate = contCreate+1
end
a = "a"
contCreate = 0
print('strings')
while contCreate <= limit do
a = contCreate .. "b";
a = string.gsub(a, '(%d%d*)', string.upper)
a = "a"
contCreate = contCreate+1
end
contCreate = 0
a = {}
print('functions')
function a:test ()
while contCreate <= limit do
load(string.format("function temp(a) return 'a%d' end", contCreate))()
assert(temp() == string.format('a%d', contCreate))
contCreate = contCreate+1
end
end
a:test()
-- collection of functions without locals, globals, etc.
do local f = function () end end
print("functions with errors")
prog = [[
do
a = 10;
function foo(x,y)
a = sin(a+0.456-0.23e-12);
return function (z) return sin(%x+z) end
end
local x = function (w) a=a+w; end
end
]]
do
local step = 1
if _soft then step = 13 end
for i=1, string.len(prog), step do
for j=i, string.len(prog), step do
pcall(load(string.sub(prog, i, j)))
end
end
end
foo = nil
print('long strings')
x = "01234567890123456789012345678901234567890123456789012345678901234567890123456789"
assert(string.len(x)==80)
s = ''
n = 0
k = 300
while n < k do s = s..x; n=n+1; j=tostring(n) end
assert(string.len(s) == k*80)
s = string.sub(s, 1, 20000)
s, i = string.gsub(s, '(%d%d%d%d)', math.sin)
assert(i==20000/4)
s = nil
x = nil
assert(_G["while"] == 234)
local k,b = collectgarbage("count")
assert(k*1024 == math.floor(k)*1024 + b)
print("steps")
local bytes = gcinfo()
while 1 do
local nbytes = gcinfo()
if nbytes < bytes then break end -- run until gc
bytes = nbytes
a = {}
end
print("steps (2)")
local function dosteps (siz)
assert(not collectgarbage("isrunning"))
collectgarbage()
assert(not collectgarbage("isrunning"))
local a = {}
for i=1,100 do a[i] = {{}}; local b = {} end
local x = gcinfo()
local i = 0
repeat -- do steps until it completes a collection cycle
i = i+1
until collectgarbage("step", siz)
assert(gcinfo() < x)
return i
end
collectgarbage"stop"
if not _port then
-- test the "size" of basic GC steps (whatever they mean...)
assert(dosteps(0) > 10)
assert(dosteps(10) < dosteps(2))
end
-- collector should do a full collection with so many steps
assert(dosteps(100000) == 1)
assert(collectgarbage("step", 1000000) == true)
assert(collectgarbage("step", 1000000) == true)
assert(not collectgarbage("isrunning"))
collectgarbage"restart"
assert(collectgarbage("isrunning"))
if not _port then
-- test the pace of the collector
collectgarbage(); collectgarbage()
local x = gcinfo()
collectgarbage"stop"
assert(not collectgarbage("isrunning"))
repeat
local a = {}
until gcinfo() > 3 * x
collectgarbage"restart"
assert(collectgarbage("isrunning"))
repeat
local a = {}
until gcinfo() <= x * 2
end
print("clearing tables")
lim = 15
a = {}
-- fill a with `collectable' indices
for i=1,lim do a[{}] = i end
b = {}
for k,v in pairs(a) do b[k]=v end
-- remove all indices and collect them
for n in pairs(b) do
a[n] = nil
assert(type(n) == 'table' and next(n) == nil)
collectgarbage()
end
b = nil
collectgarbage()
for n in pairs(a) do error'cannot be here' end
for i=1,lim do a[i] = i end
for i=1,lim do assert(a[i] == i) end
print('weak tables')
a = {}; setmetatable(a, {__mode = 'k'});
-- fill a with some `collectable' indices
for i=1,lim do a[{}] = i end
-- and some non-collectable ones
for i=1,lim do a[i] = i end
for i=1,lim do local s=string.rep('@', i); a[s] = s..'#' end
collectgarbage()
local i = 0
for k,v in pairs(a) do assert(k==v or k..'#'==v); i=i+1 end
assert(i == 2*lim)
a = {}; setmetatable(a, {__mode = 'v'});
a[1] = string.rep('b', 21)
collectgarbage()
assert(a[1]) -- strings are *values*
a[1] = nil
-- fill a with some `collectable' values (in both parts of the table)
for i=1,lim do a[i] = {} end
for i=1,lim do a[i..'x'] = {} end
-- and some non-collectable ones
for i=1,lim do local t={}; a[t]=t end
for i=1,lim do a[i+lim]=i..'x' end
collectgarbage()
local i = 0
for k,v in pairs(a) do assert(k==v or k-lim..'x' == v); i=i+1 end
assert(i == 2*lim)
a = {}; setmetatable(a, {__mode = 'vk'});
local x, y, z = {}, {}, {}
-- keep only some items
a[1], a[2], a[3] = x, y, z
a[string.rep('$', 11)] = string.rep('$', 11)
-- fill a with some `collectable' values
for i=4,lim do a[i] = {} end
for i=1,lim do a[{}] = i end
for i=1,lim do local t={}; a[t]=t end
collectgarbage()
assert(next(a) ~= nil)
local i = 0
for k,v in pairs(a) do
assert((k == 1 and v == x) or
(k == 2 and v == y) or
(k == 3 and v == z) or k==v);
i = i+1
end
assert(i == 4)
x,y,z=nil
collectgarbage()
assert(next(a) == string.rep('$', 11))
-- 'bug' in 5.1
a = {}
local t = {x = 10}
local C = setmetatable({key = t}, {__mode = 'v'})
local C1 = setmetatable({[t] = 1}, {__mode = 'k'})
a.x = t -- this should not prevent 't' from being removed from
-- weak table 'C' by the time 'a' is finalized
setmetatable(a, {__gc = function (u)
assert(C.key == nil)
assert(type(next(C1)) == 'table')
end})
a, t = nil
collectgarbage()
collectgarbage()
assert(next(C) == nil and next(C1) == nil)
C, C1 = nil
-- ephemerons
local mt = {__mode = 'k'}
a = {10,20,30,40}; setmetatable(a, mt)
x = nil
for i = 1, 100 do local n = {}; a[n] = {k = {x}}; x = n end
GC()
local n = x
local i = 0
while n do n = a[n].k[1]; i = i + 1 end
assert(i == 100)
x = nil
GC()
for i = 1, 4 do assert(a[i] == i * 10); a[i] = nil end
assert(next(a) == nil)
local K = {}
a[K] = {}
for i=1,10 do a[K][i] = {}; a[a[K][i]] = setmetatable({}, mt) end
x = nil
local k = 1
for j = 1,100 do
local n = {}; local nk = k%10 + 1
a[a[K][nk]][n] = {x, k = k}; x = n; k = nk
end
GC()
local n = x
local i = 0
while n do local t = a[a[K][k]][n]; n = t[1]; k = t.k; i = i + 1 end
assert(i == 100)
K = nil
GC()
assert(next(a) == nil)
-- testing errors during GC
do
collectgarbage("stop") -- stop collection
local u = {}
local s = {}; setmetatable(s, {__mode = 'k'})
setmetatable(u, {__gc = function (o)
local i = s[o]
s[i] = true
assert(not s[i - 1]) -- check proper finalization order
if i == 8 then error("here") end -- error during GC
end})
for i = 6, 10 do
local n = setmetatable({}, getmetatable(u))
s[n] = i
end
assert(not pcall(collectgarbage))
for i = 8, 10 do assert(s[i]) end
for i = 1, 5 do
local n = setmetatable({}, getmetatable(u))
s[n] = i
end
collectgarbage()
for i = 1, 10 do assert(s[i]) end
getmetatable(u).__gc = false
-- __gc errors with non-string messages
setmetatable({}, {__gc = function () error{} end})
local a, b = pcall(collectgarbage)
assert(not a and type(b) == "string" and string.find(b, "error in __gc"))
end
print '+'
-- testing userdata
if T==nil then
(Message or print)('\a\n >>> testC not active: skipping userdata GC tests <<<\n\a')
else
local function newproxy(u)
return debug.setmetatable(T.newuserdata(0), debug.getmetatable(u))
end
collectgarbage("stop") -- stop collection
local u = newproxy(nil)
debug.setmetatable(u, {__gc = true})
local s = 0
local a = {[u] = 0}; setmetatable(a, {__mode = 'vk'})
for i=1,10 do a[newproxy(u)] = i end
for k in pairs(a) do assert(getmetatable(k) == getmetatable(u)) end
local a1 = {}; for k,v in pairs(a) do a1[k] = v end
for k,v in pairs(a1) do a[v] = k end
for i =1,10 do assert(a[i]) end
getmetatable(u).a = a1
getmetatable(u).u = u
do
local u = u
getmetatable(u).__gc = function (o)
assert(a[o] == 10-s)
assert(a[10-s] == nil) -- udata already removed from weak table
assert(getmetatable(o) == getmetatable(u))
assert(getmetatable(o).a[o] == 10-s)
s=s+1
end
end
a1, u = nil
assert(next(a) ~= nil)
collectgarbage()
assert(s==11)
collectgarbage()
assert(next(a) == nil) -- finalized keys are removed in two cycles
end
-- __gc x weak tables
local u = setmetatable({}, {__gc = true})
-- __gc metamethod should be collected before running
setmetatable(getmetatable(u), {__mode = "v"})
getmetatable(u).__gc = function (o) os.exit(1) end -- cannot happen
u = nil
collectgarbage()
local u = setmetatable({}, {__gc = true})
local m = getmetatable(u)
m.x = {[{0}] = 1; [0] = {1}}; setmetatable(m.x, {__mode = "kv"});
m.__gc = function (o)
assert(next(getmetatable(o).x) == nil)
m = 10
end
u, m = nil
collectgarbage()
assert(m==10)
-- errors during collection
u = setmetatable({}, {__gc = function () error "!!!" end})
u = nil
assert(not pcall(collectgarbage))
if not _soft then
print("deep structures")
local a = {}
for i = 1,200000 do
a = {next = a}
end
collectgarbage()
end
-- create many threads with self-references and open upvalues
local thread_id = 0
local threads = {}
local function fn (thread)
local x = {}
threads[thread_id] = function()
thread = x
end
coroutine.yield()
end
while thread_id < 1000 do
local thread = coroutine.create(fn)
coroutine.resume(thread, thread)
thread_id = thread_id + 1
end
do
collectgarbage()
collectgarbage"stop"
local x = gcinfo()
repeat
for i=1,1000 do _ENV.a = {} end
collectgarbage("step", 1) -- steps should not unblock the collector
until gcinfo() > 2 * x
collectgarbage"restart"
end
if T then -- tests for weird cases collecting upvalues
local a = 1200
local f = function () return a end -- create upvalue for 'a'
assert(f() == 1200)
-- erase reference to upvalue 'a', mark it as dead, but does not collect it
T.gcstate("pause"); collectgarbage("stop")
f = nil
T.gcstate("sweepstring")
-- this function will reuse that dead upvalue...
f = function () return a end
assert(f() == 1200)
-- create coroutine with local variable 'b'
local co = coroutine.wrap(function()
local b = 150
coroutine.yield(function () return b end)
end)
T.gcstate("pause")
assert(co()() == 150) -- create upvalue for 'b'
-- mark upvalue 'b' as dead, but does not collect it
T.gcstate("sweepstring")
co() -- finish coroutine, "closing" that dead upvalue
assert(f() == 1200)
collectgarbage("restart")
print"+"
end
if T then
local debug = require "debug"
collectgarbage("generational"); collectgarbage("stop")
x = T.newuserdata(0)
T.gcstate("propagate") -- ensure 'x' is old
T.gcstate("sweepstring")
T.gcstate("propagate")
assert(string.find(T.gccolor(x), "/old"))
local y = T.newuserdata(0)
debug.setmetatable(y, {__gc = true}) -- bless the new udata before...
debug.setmetatable(x, {__gc = true}) -- ...the old one
assert(string.find(T.gccolor(y), "white"))
T.checkmemory()
collectgarbage("incremental"); collectgarbage("restart")
end
if T then
print("emergency collections")
collectgarbage()
collectgarbage()
T.totalmem(T.totalmem() + 200)
for i=1,200 do local a = {} end
T.totalmem(1000000000)
collectgarbage()
local t = T.totalmem("table")
local a = {{}, {}, {}} -- create 4 new tables
assert(T.totalmem("table") == t + 4)
t = T.totalmem("function")
a = function () end -- create 1 new closure
assert(T.totalmem("function") == t + 1)
t = T.totalmem("thread")
a = coroutine.create(function () end) -- create 1 new coroutine
assert(T.totalmem("thread") == t + 1)
end
-- create an object to be collected when state is closed
do
local setmetatable,assert,type,print,getmetatable =
setmetatable,assert,type,print,getmetatable
local tt = {}
tt.__gc = function (o)
assert(getmetatable(o) == tt)
-- create new objects during GC
local a = 'xuxu'..(10+3)..'joao', {}
___Glob = o -- ressurect object!
setmetatable({}, tt) -- creates a new one with same metatable
print(">>> closing state " .. "<<<\n")
end
local u = setmetatable({}, tt)
___Glob = {u} -- avoid object being collected before program end
end
-- create several objects to raise errors when collected while closing state
do
local mt = {__gc = function (o) return o + 1 end}
for i = 1,10 do
-- create object and preserve it until the end
table.insert(___Glob, setmetatable({}, mt))
end
end
-- just to make sure
assert(collectgarbage'isrunning')
print('OK')

Binary file not shown.

View File

@@ -0,0 +1,173 @@
local function errmsg (code, m)
local st, msg = load(code)
assert(not st and string.find(msg, m))
end
-- cannot see label inside block
errmsg([[ goto l1; do ::l1:: end ]], "label 'l1'")
errmsg([[ do ::l1:: end goto l1; ]], "label 'l1'")
-- repeated label
errmsg([[ ::l1:: ::l1:: ]], "label 'l1'")
-- undefined label
errmsg([[ goto l1; local aa ::l1:: ::l2:: print(3) ]], "local 'aa'")
-- jumping over variable definition
errmsg([[
do local bb, cc; goto l1; end
local aa
::l1:: print(3)
]], "local 'aa'")
-- jumping into a block
errmsg([[ do ::l1:: end goto l1 ]], "label 'l1'")
errmsg([[ goto l1 do ::l1:: end ]], "label 'l1'")
-- cannot continue a repeat-until with variables
errmsg([[
repeat
if x then goto cont end
local xuxu = 10
::cont::
until xuxu < x
]], "local 'xuxu'")
-- simple gotos
local x
do
local y = 12
goto l1
::l2:: x = x + 1; goto l3
::l1:: x = y; goto l2
end
::l3:: ::l3_1:: assert(x == 13)
-- long labels
do
local prog = [[
do
local a = 1
goto l%sa; a = a + 1
::l%sa:: a = a + 10
goto l%sb; a = a + 2
::l%sb:: a = a + 20
return a
end
]]
local label = string.rep("0123456789", 40)
prog = string.format(prog, label, label, label, label)
assert(assert(load(prog))() == 31)
end
-- goto to correct label when nested
do goto l3; ::l3:: end -- does not loop jumping to previous label 'l3'
-- ok to jump over local dec. to end of block
do
goto l1
local a = 23
x = a
::l1::;
end
while true do
goto l4
goto l1 -- ok to jump over local dec. to end of block
goto l1 -- multiple uses of same label
local x = 45
::l1:: ;;;
end
::l4:: assert(x == 13)
if print then
goto l1 -- ok to jump over local dec. to end of block
error("should not be here")
goto l2 -- ok to jump over local dec. to end of block
local x
::l1:: ; ::l2:: ;;
else end
-- to repeat a label in a different function is OK
local function foo ()
local a = {}
goto l3
::l1:: a[#a + 1] = 1; goto l2;
::l2:: a[#a + 1] = 2; goto l5;
::l3::
::l3a:: a[#a + 1] = 3; goto l1;
::l4:: a[#a + 1] = 4; goto l6;
::l5:: a[#a + 1] = 5; goto l4;
::l6:: assert(a[1] == 3 and a[2] == 1 and a[3] == 2 and
a[4] == 5 and a[5] == 4)
if not a[6] then a[6] = true; goto l3a end -- do it twice
end
::l6:: foo()
--------------------------------------------------------------------------------
-- testing closing of upvalues
local function foo ()
local a = {}
do
local i = 1
local k = 0
a[0] = function (y) k = y end
::l1:: do
local x
if i > 2 then goto l2 end
a[i] = function (y) if y then x = y else return x + k end end
i = i + 1
goto l1
end
end
::l2:: return a
end
local a = foo()
a[1](10); a[2](20)
assert(a[1]() == 10 and a[2]() == 20 and a[3] == nil)
a[0](13)
assert(a[1]() == 23 and a[2]() == 33)
--------------------------------------------------------------------------------
-- testing if x goto optimizations
local function testG (a)
if a == 1 then
goto l1
error("should never be here!")
elseif a == 2 then goto l2
elseif a == 3 then goto l3
elseif a == 4 then
goto l1 -- go to inside the block
error("should never be here!")
::l1:: a = a + 1 -- must go to 'if' end
else
goto l4
::l4a:: a = a * 2; goto l4b
error("should never be here!")
::l4:: goto l4a
error("should never be here!")
::l4b::
end
do return a end
::l2:: do return "2" end
::l3:: do return "3" end
::l1:: return "1"
end
assert(testG(1) == "1")
assert(testG(2) == "2")
assert(testG(3) == "3")
assert(testG(4) == 5)
assert(testG(5) == 10)
--------------------------------------------------------------------------------
print'OK'

View File

@@ -0,0 +1,258 @@
print('testing scanner')
debug = require "debug"
local function dostring (x) return assert(load(x))() end
dostring("x \v\f = \t\r 'a\0a' \v\f\f")
assert(x == 'a\0a' and string.len(x) == 3)
-- escape sequences
assert('\n\"\'\\' == [[
"'\]])
assert(string.find("\a\b\f\n\r\t\v", "^%c%c%c%c%c%c%c$"))
-- assume ASCII just for tests:
assert("\09912" == 'c12')
assert("\99ab" == 'cab')
assert("\099" == '\99')
assert("\099\n" == 'c\10')
assert('\0\0\0alo' == '\0' .. '\0\0' .. 'alo')
assert(010 .. 020 .. -030 == "1020-30")
-- hexadecimal escapes
assert("\x00\x05\x10\x1f\x3C\xfF\xe8" == "\0\5\16\31\60\255\232")
local function lexstring (x, y, n)
local f = assert(load('return '..x..', debug.getinfo(1).currentline'))
local s, l = f()
assert(s == y and l == n)
end
lexstring("'abc\\z \n efg'", "abcefg", 2)
lexstring("'abc\\z \n\n\n'", "abc", 4)
lexstring("'\\z \n\t\f\v\n'", "", 3)
lexstring("[[\nalo\nalo\n\n]]", "alo\nalo\n\n", 5)
lexstring("[[\nalo\ralo\n\n]]", "alo\nalo\n\n", 5)
lexstring("[[\nalo\ralo\r\n]]", "alo\nalo\n", 4)
lexstring("[[\ralo\n\ralo\r\n]]", "alo\nalo\n", 4)
lexstring("[[alo]\n]alo]]", "alo]\n]alo", 2)
assert("abc\z
def\z
ghi\z
" == 'abcdefghi')
-- Error in escape sequences
local function lexerror (s, err)
local st, msg = load('return '..s)
if err ~= '<eof>' then err = "'"..err.."'" end
assert(not st and string.find(msg, "near "..err, 1, true))
end
lexerror([["abc\x"]], [[\x"]])
lexerror([["abc\x]], [[\x]])
lexerror([["\x]], [[\x]])
lexerror([["\x5"]], [[\x5"]])
lexerror([["\x5]], [[\x5]])
lexerror([["\xr"]], [[\xr]])
lexerror([["\xr]], [[\xr]])
lexerror([["\x.]], [[\x.]])
lexerror([["\x8%"]], [[\x8%]])
lexerror([["\xAG]], [[\xAG]])
lexerror([["\g"]], [[\g]])
lexerror([["\g]], [[\g]])
lexerror([["\."]], [[\.]])
lexerror([["\999"]], [[\999]])
lexerror([["xyz\300"]], [[\300]])
lexerror([[" \256"]], [[\256]])
-- unfinished strings
lexerror("[=[alo]]", "<eof>")
lexerror("[=[alo]=", "<eof>")
lexerror("[=[alo]", "<eof>")
lexerror("'alo", "<eof>")
lexerror("'alo \\z \n\n", "<eof>")
lexerror("'alo \\z", "<eof>")
lexerror([['alo \98]], "<eof>")
-- valid characters in variable names
for i = 0, 255 do
local s = string.char(i)
assert(not string.find(s, "[a-zA-Z_]") == not load(s .. "=1"))
assert(not string.find(s, "[a-zA-Z_0-9]") ==
not load("a" .. s .. "1 = 1"))
end
-- long variable names
var = string.rep('a', 15000)
prog = string.format("%s = 5", var)
dostring(prog)
assert(_G[var] == 5)
var = nil
print('+')
-- escapes --
assert("\n\t" == [[
]])
assert([[
$debug]] == "\n $debug")
assert([[ [ ]] ~= [[ ] ]])
-- long strings --
b = "001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789"
assert(string.len(b) == 960)
prog = [=[
print('+')
a1 = [["isto e' um string com várias 'aspas'"]]
a2 = "'aspas'"
assert(string.find(a1, a2) == 31)
print('+')
a1 = [==[temp = [[um valor qualquer]]; ]==]
assert(load(a1))()
assert(temp == 'um valor qualquer')
-- long strings --
b = "001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789"
assert(string.len(b) == 960)
print('+')
a = [[00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
00123456789012345678901234567890123456789123456789012345678901234567890123456789
]]
assert(string.len(a) == 1863)
assert(string.sub(a, 1, 40) == string.sub(b, 1, 40))
x = 1
]=]
print('+')
x = nil
dostring(prog)
assert(x)
prog = nil
a = nil
b = nil
-- testing line ends
prog = [[
a = 1 -- a comment
b = 2
x = [=[
hi
]=]
y = "\
hello\r\n\
"
return debug.getinfo(1).currentline
]]
for _, n in pairs{"\n", "\r", "\n\r", "\r\n"} do
local prog, nn = string.gsub(prog, "\n", n)
assert(dostring(prog) == nn)
assert(_G.x == "hi\n" and _G.y == "\nhello\r\n\n")
end
-- testing comments and strings with long brackets
a = [==[]=]==]
assert(a == "]=")
a = [==[[===[[=[]]=][====[]]===]===]==]
assert(a == "[===[[=[]]=][====[]]===]===")
a = [====[[===[[=[]]=][====[]]===]===]====]
assert(a == "[===[[=[]]=][====[]]===]===")
a = [=[]]]]]]]]]=]
assert(a == "]]]]]]]]")
--[===[
x y z [==[ blu foo
]==
]
]=]==]
error error]=]===]
-- generate all strings of four of these chars
local x = {"=", "[", "]", "\n"}
local len = 4
local function gen (c, n)
if n==0 then coroutine.yield(c)
else
for _, a in pairs(x) do
gen(c..a, n-1)
end
end
end
for s in coroutine.wrap(function () gen("", len) end) do
assert(s == load("return [====[\n"..s.."]====]")())
end
-- testing decimal point locale
if os.setlocale("pt_BR") or os.setlocale("ptb") then
assert(not load("á = 3")) -- parser still works with C locale
assert(not load("a = (3,4)"))
assert(tonumber("3,4") == 3.4 and tonumber"3.4" == nil)
assert(assert(load("return 3.4"))() == 3.4)
assert(assert(load("return .4,3"))() == .4)
assert(assert(load("return 4."))() == 4.)
assert(assert(load("return 4.+.5"))() == 4.5)
local a,b = load("return 4.5.")
assert(string.find(b, "'4%.5%.'"))
assert(os.setlocale("C"))
else
(Message or print)(
'\a\n >>> pt_BR locale not available: skipping decimal point tests <<<\n\a')
end
-- testing %q x line ends
local s = "a string with \r and \n and \r\n and \n\r"
local c = string.format("return %q", s)
assert(assert(load(c))() == s)
-- testing errors
assert(not load"a = 'non-ending string")
assert(not load"a = 'non-ending string\n'")
assert(not load"a = '\\345'")
assert(not load"a = [=x]")
print('OK')

Binary file not shown.

View File

@@ -0,0 +1,157 @@
print('testing local variables and environments')
local debug = require"debug"
-- bug in 5.1:
local function f(x) x = nil; return x end
assert(f(10) == nil)
local function f() local x; return x end
assert(f(10) == nil)
local function f(x) x = nil; local y; return x, y end
assert(f(10) == nil and select(2, f(20)) == nil)
do
local i = 10
do local i = 100; assert(i==100) end
do local i = 1000; assert(i==1000) end
assert(i == 10)
if i ~= 10 then
local i = 20
else
local i = 30
assert(i == 30)
end
end
f = nil
local f
x = 1
a = nil
load('local a = {}')()
assert(a == nil)
function f (a)
local _1, _2, _3, _4, _5
local _6, _7, _8, _9, _10
local x = 3
local b = a
local c,d = a,b
if (d == b) then
local x = 'q'
x = b
assert(x == 2)
else
assert(nil)
end
assert(x == 3)
local f = 10
end
local b=10
local a; repeat local b; a,b=1,2; assert(a+1==b); until a+b==3
assert(x == 1)
f(2)
assert(type(f) == 'function')
local function getenv (f)
local a,b = debug.getupvalue(f, 1)
assert(a == '_ENV')
return b
end
-- test for global table of loaded chunks
assert(getenv(load"a=3") == _G)
local c = {}; local f = load("a = 3", nil, nil, c)
assert(getenv(f) == c)
assert(c.a == nil)
f()
assert(c.a == 3)
-- testing limits for special instructions
if not _soft then
local a
local p = 4
for i=2,31 do
for j=-3,3 do
assert(load(string.format([[local a=%s;
a=a+%s;
assert(a ==2^%s)]], j, p-j, i))) ()
assert(load(string.format([[local a=%s;
a=a-%s;
assert(a==-2^%s)]], -j, p-j, i))) ()
assert(load(string.format([[local a,b=0,%s;
a=b-%s;
assert(a==-2^%s)]], -j, p-j, i))) ()
end
p =2*p
end
end
print'+'
if rawget(_G, "querytab") then
-- testing clearing of dead elements from tables
collectgarbage("stop") -- stop GC
local a = {[{}] = 4, [3] = 0, alo = 1,
a1234567890123456789012345678901234567890 = 10}
local t = querytab(a)
for k,_ in pairs(a) do a[k] = nil end
collectgarbage() -- restore GC and collect dead fiels in `a'
for i=0,t-1 do
local k = querytab(a, i)
assert(k == nil or type(k) == 'number' or k == 'alo')
end
end
-- testing lexical environments
assert(_ENV == _G)
do local _ENV = (function (...) return ... end)(_G, dummy)
do local _ENV = {assert=assert}; assert(true) end
mt = {_G = _G}
local foo,x
do local _ENV = mt
function foo (x)
A = x
do local _ENV = _G; A = 1000 end
return function (x) return A .. x end
end
end
assert(getenv(foo) == mt)
x = foo('hi'); assert(mt.A == 'hi' and A == 1000)
assert(x('*') == mt.A .. '*')
do local _ENV = {assert=assert, A=10};
do local _ENV = {assert=assert, A=20};
assert(A==20);x=A
end
assert(A==10 and x==20)
end
assert(x==20)
print('OK')
return 5,f
end

Binary file not shown.

View File

@@ -0,0 +1,260 @@
# testing special comment on first line
-- most (all?) tests here assume a reasonable "Unix-like" shell
if _port then return end
print ("testing lua.c options")
assert(os.execute()) -- machine has a system command
prog = os.tmpname()
otherprog = os.tmpname()
out = os.tmpname()
do
local i = 0
while arg[i] do i=i-1 end
progname = arg[i+1]
end
print("progname: "..progname)
local prepfile = function (s, p)
p = p or prog
io.output(p)
io.write(s)
assert(io.close())
end
function getoutput ()
io.input(out)
local t = io.read("*a")
io.input():close()
assert(os.remove(out))
return t
end
function checkprogout (s)
local t = getoutput()
for line in string.gmatch(s, ".-\n") do
assert(string.find(t, line, 1, true))
end
end
function checkout (s)
local t = getoutput()
if s ~= t then print(string.format("'%s' - '%s'\n", s, t)) end
assert(s == t)
return t
end
function auxrun (...)
local s = string.format(...)
s = string.gsub(s, "lua", '"'..progname..'"', 1)
return os.execute(s)
end
function RUN (...)
assert(auxrun(...))
end
function NoRun (...)
assert(not auxrun(...))
end
function NoRunMsg (...)
print("\n(the next error is expected by the test)")
return NoRun(...)
end
-- test environment variables used by Lua
prepfile("print(package.path)")
RUN("env LUA_INIT= LUA_PATH=x lua %s > %s", prog, out)
checkout("x\n")
RUN("env LUA_INIT= LUA_PATH_5_2=y LUA_PATH=x lua %s > %s", prog, out)
checkout("y\n")
prepfile("print(package.cpath)")
RUN("env LUA_INIT= LUA_CPATH=xuxu lua %s > %s", prog, out)
checkout("xuxu\n")
RUN("env LUA_INIT= LUA_CPATH_5_2=yacc LUA_CPATH=x lua %s > %s", prog, out)
checkout("yacc\n")
prepfile("print(X)")
RUN('env LUA_INIT="X=3" lua %s > %s', prog, out)
checkout("3\n")
prepfile("print(X)")
RUN('env LUA_INIT_5_2="X=10" LUA_INIT="X=3" lua %s > %s', prog, out)
checkout("10\n")
-- test option '-E'
prepfile("print(package.path, package.cpath)")
RUN('env LUA_INIT="error(10)" LUA_PATH=xxx LUA_CPATH=xxx lua -E %s > %s',
prog, out)
local defaultpath = getoutput()
defaultpath = string.match(defaultpath, "^(.-)\t") -- remove tab
assert(not string.find(defaultpath, "xxx") and string.find(defaultpath, "lua"))
-- test replacement of ';;' to default path
local function convert (p)
prepfile("print(package.path)")
RUN('env LUA_PATH="%s" lua %s > %s', p, prog, out)
local expected = getoutput()
expected = string.sub(expected, 1, -2) -- cut final end of line
assert(string.gsub(p, ";;", ";"..defaultpath..";") == expected)
end
convert(";")
convert(";;")
convert(";;;")
convert(";;;;")
convert(";;;;;")
convert(";;a;;;bc")
-- test 2 files
prepfile("print(1); a=2; return {x=15}")
prepfile(("print(a); print(_G['%s'].x)"):format(prog), otherprog)
RUN('env LUA_PATH="?;;" lua -l %s -l%s -lstring -l io %s > %s', prog, otherprog, otherprog, out)
checkout("1\n2\n15\n2\n15\n")
local a = [[
assert(#arg == 3 and arg[1] == 'a' and
arg[2] == 'b' and arg[3] == 'c')
assert(arg[-1] == '--' and arg[-2] == "-e " and arg[-3] == '%s')
assert(arg[4] == nil and arg[-4] == nil)
local a, b, c = ...
assert(... == 'a' and a == 'a' and b == 'b' and c == 'c')
]]
a = string.format(a, progname)
prepfile(a)
RUN('lua "-e " -- %s a b c', prog)
prepfile"assert(arg==nil)"
prepfile("assert(arg)", otherprog)
RUN('env LUA_PATH="?;;" lua -l%s - < %s', prog, otherprog)
prepfile""
RUN("lua - < %s > %s", prog, out)
checkout("")
-- test many arguments
prepfile[[print(({...})[30])]]
RUN("lua %s %s > %s", prog, string.rep(" a", 30), out)
checkout("a\n")
RUN([[lua "-eprint(1)" -ea=3 -e "print(a)" > %s]], out)
checkout("1\n3\n")
prepfile[[
print(
1, a
)
]]
RUN("lua - < %s > %s", prog, out)
checkout("1\tnil\n")
prepfile[[
= (6*2-6) -- ===
a
= 10
print(a)
= a]]
RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out)
checkprogout("6\n10\n10\n\n")
prepfile("a = [[b\nc\nd\ne]]\n=a")
print("temporary program file: "..prog)
RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out)
checkprogout("b\nc\nd\ne\n\n")
prompt = "alo"
prepfile[[ --
a = 2
]]
RUN([[lua "-e_PROMPT='%s'" -i < %s > %s]], prompt, prog, out)
local t = getoutput()
assert(string.find(t, prompt .. ".*" .. prompt .. ".*" .. prompt))
-- test for error objects
prepfile[[
debug = require "debug"
m = {x=0}
setmetatable(m, {__tostring = function(x)
return debug.getinfo(4).currentline + x.x
end})
error(m)
]]
NoRun([[lua %s 2> %s]], prog, out) -- no message
checkout(progname..": 6\n")
s = [=[ --
function f ( x )
local a = [[
xuxu
]]
local b = "\
xuxu\n"
if x == 11 then return 1 , 2 end --[[ test multiple returns ]]
return x + 1
--\\
end
=( f( 10 ) )
assert( a == b )
=f( 11 ) ]=]
s = string.gsub(s, ' ', '\n\n')
prepfile(s)
RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out)
checkprogout("11\n1\t2\n\n")
prepfile[[#comment in 1st line without \n at the end]]
RUN("lua %s", prog)
prepfile[[#test line number when file starts with comment line
debug = require"debug"
print(debug.getinfo(1).currentline)
]]
RUN("lua %s > %s", prog, out)
checkprogout('3')
-- close Lua with an open file
prepfile(string.format([[io.output(%q); io.write('alo')]], out))
RUN("lua %s", prog)
checkout('alo')
-- bug in 5.2 beta (extra \0 after version line)
RUN([[lua -v -e'print"hello"' > %s]], out)
t = getoutput()
assert(string.find(t, "PUC%-Rio\nhello"))
-- testing os.exit
prepfile("os.exit(nil, true)")
RUN("lua %s", prog)
prepfile("os.exit(0, true)")
RUN("lua %s", prog)
prepfile("os.exit(true, true)")
RUN("lua %s", prog)
prepfile("os.exit(1, true)")
NoRun("lua %s", prog) -- no message
prepfile("os.exit(false, true)")
NoRun("lua %s", prog) -- no message
assert(os.remove(prog))
assert(os.remove(otherprog))
assert(not os.remove(out))
RUN("lua -v")
NoRunMsg("lua -h")
NoRunMsg("lua -e")
NoRunMsg("lua -e a")
NoRunMsg("lua -f")
print("OK")

Binary file not shown.

View File

@@ -0,0 +1,293 @@
print("testing numbers and math lib")
-- basic float notation
assert(0e12 == 0 and .0 == 0 and 0. == 0 and .2e2 == 20 and 2.E-1 == 0.2)
do
local a,b,c = "2", " 3e0 ", " 10 "
assert(a+b == 5 and -b == -3 and b+"2" == 5 and "10"-c == 0)
assert(type(a) == 'string' and type(b) == 'string' and type(c) == 'string')
assert(a == "2" and b == " 3e0 " and c == " 10 " and -c == -" 10 ")
assert(c%a == 0 and a^b == 08)
a = 0
assert(a == -a)
-- luaj folds -0 into 0
-- assert(0 == -0)
end
do
local x = -1
local mz = 0/x -- minus zero
t = {[0] = 10, 20, 30, 40, 50}
assert(t[mz] == t[0])
-- luaj folds -0 into 0
-- assert(t[-0] == t[0])
end
do
local a,b = math.modf(3.5)
assert(a == 3 and b == 0.5)
assert(math.huge > 10e30)
assert(-math.huge < -10e30)
end
function f(...)
if select('#', ...) == 1 then
return (...)
else
return "***"
end
end
-- testing numeric strings
assert("2" + 1 == 3)
assert("2 " + 1 == 3)
assert(" -2 " + 1 == -1)
assert(" -0xa " + 1 == -9)
-- testing 'tonumber'
assert(tonumber{} == nil)
assert(tonumber'+0.01' == 1/100 and tonumber'+.01' == 0.01 and
tonumber'.01' == 0.01 and tonumber'-1.' == -1 and
tonumber'+1.' == 1)
assert(tonumber'+ 0.01' == nil and tonumber'+.e1' == nil and
tonumber'1e' == nil and tonumber'1.0e+' == nil and
tonumber'.' == nil)
assert(tonumber('-012') == -010-2)
assert(tonumber('-1.2e2') == - - -120)
assert(tonumber("0xffffffffffff") == 2^(4*12) - 1)
assert(tonumber("0x"..string.rep("f", 150)) == 2^(4*150) - 1)
assert(tonumber('0x3.' .. string.rep('0', 100)) == 3)
assert(tonumber('0x0.' .. string.rep('0', 150).."1") == 2^(-4*151))
-- testing 'tonumber' with base
assert(tonumber(' 001010 ', 2) == 10)
assert(tonumber(' 001010 ', 10) == 001010)
assert(tonumber(' -1010 ', 2) == -10)
assert(tonumber('10', 36) == 36)
assert(tonumber(' -10 ', 36) == -36)
assert(tonumber(' +1Z ', 36) == 36 + 35)
assert(tonumber(' -1z ', 36) == -36 + -35)
assert(tonumber('-fFfa', 16) == -(10+(16*(15+(16*(15+(16*15)))))))
assert(tonumber(string.rep('1', 42), 2) + 1 == 2^42)
assert(tonumber(string.rep('1', 34), 2) + 1 == 2^34)
assert(tonumber('ffffFFFF', 16)+1 == 2^32)
assert(tonumber('0ffffFFFF', 16)+1 == 2^32)
assert(tonumber('-0ffffffFFFF', 16) - 1 == -2^40)
for i = 2,36 do
assert(tonumber('\t10000000000\t', i) == i^10)
end
-- testing 'tonumber' fo invalid formats
assert(f(tonumber('fFfa', 15)) == nil)
assert(f(tonumber('099', 8)) == nil)
assert(f(tonumber('1\0', 2)) == nil)
assert(f(tonumber('', 8)) == nil)
assert(f(tonumber(' ', 9)) == nil)
assert(f(tonumber(' ', 9)) == nil)
assert(f(tonumber('0xf', 10)) == nil)
assert(f(tonumber('inf')) == nil)
assert(f(tonumber(' INF ')) == nil)
assert(f(tonumber('Nan')) == nil)
assert(f(tonumber('nan')) == nil)
assert(f(tonumber(' ')) == nil)
assert(f(tonumber('')) == nil)
assert(f(tonumber('1 a')) == nil)
assert(f(tonumber('1\0')) == nil)
assert(f(tonumber('1 \0')) == nil)
assert(f(tonumber('1\0 ')) == nil)
assert(f(tonumber('e1')) == nil)
assert(f(tonumber('e 1')) == nil)
assert(f(tonumber(' 3.4.5 ')) == nil)
-- testing 'tonumber' for invalid hexadecimal formats
assert(tonumber('0x') == nil)
assert(tonumber('x') == nil)
assert(tonumber('x3') == nil)
assert(tonumber('00x2') == nil)
assert(tonumber('0x 2') == nil)
assert(tonumber('0 x2') == nil)
assert(tonumber('23x') == nil)
assert(tonumber('- 0xaa') == nil)
-- testing hexadecimal numerals
assert(0x10 == 16 and 0xfff == 2^12 - 1 and 0XFB == 251)
assert(0x0p12 == 0 and 0x.0p-3 == 0)
assert(0xFFFFFFFF == 2^32 - 1)
assert(tonumber('+0x2') == 2)
assert(tonumber('-0xaA') == -170)
assert(tonumber('-0xffFFFfff') == -2^32 + 1)
-- possible confusion with decimal exponent
assert(0E+1 == 0 and 0xE+1 == 15 and 0xe-1 == 13)
-- floating hexas
assert(tonumber(' 0x2.5 ') == 0x25/16)
assert(tonumber(' -0x2.5 ') == -0x25/16)
assert(tonumber(' +0x0.51p+8 ') == 0x51)
assert(tonumber('0x0.51p') == nil)
assert(tonumber('0x5p+-2') == nil)
assert(0x.FfffFFFF == 1 - '0x.00000001')
assert('0xA.a' + 0 == 10 + 10/16)
assert(0xa.aP4 == 0XAA)
assert(0x4P-2 == 1)
assert(0x1.1 == '0x1.' + '+0x.1')
assert(1.1 == 1.+.1)
assert(100.0 == 1E2 and .01 == 1e-2)
assert(1111111111111111-1111111111111110== 1000.00e-03)
-- 1234567890123456
assert(1.1 == '1.'+'.1')
assert('1111111111111111'-'1111111111111110' == tonumber" +0.001e+3 \n\t")
function eq (a,b,limit)
if not limit then limit = 10E-10 end
return math.abs(a-b) <= limit
end
assert(0.1e-30 > 0.9E-31 and 0.9E30 < 0.1e31)
assert(0.123456 > 0.123455)
assert(tonumber('+1.23E18') == 1.23*10^18)
-- testing order operators
assert(not(1<1) and (1<2) and not(2<1))
assert(not('a'<'a') and ('a'<'b') and not('b'<'a'))
assert((1<=1) and (1<=2) and not(2<=1))
assert(('a'<='a') and ('a'<='b') and not('b'<='a'))
assert(not(1>1) and not(1>2) and (2>1))
assert(not('a'>'a') and not('a'>'b') and ('b'>'a'))
assert((1>=1) and not(1>=2) and (2>=1))
assert(('a'>='a') and not('a'>='b') and ('b'>='a'))
-- testing mod operator
assert(-4%3 == 2)
assert(4%-3 == -2)
assert(math.pi - math.pi % 1 == 3)
assert(math.pi - math.pi % 0.001 == 3.141)
local function testbit(a, n)
return a/2^n % 2 >= 1
end
assert(eq(math.sin(-9.8)^2 + math.cos(-9.8)^2, 1))
assert(eq(math.tan(math.pi/4), 1))
assert(eq(math.sin(math.pi/2), 1) and eq(math.cos(math.pi/2), 0))
assert(eq(math.atan(1), math.pi/4) and eq(math.acos(0), math.pi/2) and
eq(math.asin(1), math.pi/2))
assert(eq(math.deg(math.pi/2), 90) and eq(math.rad(90), math.pi/2))
assert(math.abs(-10) == 10)
assert(eq(math.atan2(1,0), math.pi/2))
assert(math.ceil(4.5) == 5.0)
assert(math.floor(4.5) == 4.0)
assert(math.fmod(10,3) == 1)
assert(eq(math.sqrt(10)^2, 10))
assert(eq(math.log(2, 10), math.log(2)/math.log(10)))
assert(eq(math.log(2, 2), 1))
assert(eq(math.log(9, 3), 2))
assert(eq(math.exp(0), 1))
assert(eq(math.sin(10), math.sin(10%(2*math.pi))))
local v,e = math.frexp(math.pi)
assert(eq(math.ldexp(v,e), math.pi))
assert(eq(math.tanh(3.5), math.sinh(3.5)/math.cosh(3.5)))
assert(tonumber(' 1.3e-2 ') == 1.3e-2)
assert(tonumber(' -1.00000000000001 ') == -1.00000000000001)
-- testing constant limits
-- 2^23 = 8388608
assert(8388609 + -8388609 == 0)
assert(8388608 + -8388608 == 0)
assert(8388607 + -8388607 == 0)
-- testing implicit convertions
local a,b = '10', '20'
assert(a*b == 200 and a+b == 30 and a-b == -10 and a/b == 0.5 and -b == -20)
assert(a == '10' and b == '20')
if not _port then
print("testing -0 and NaN")
--[[ luaj folds -0 into 0
local mz, z = -0, 0
assert(mz == z)
assert(1/mz < 0 and 0 < 1/z)
local a = {[mz] = 1}
assert(a[z] == 1 and a[mz] == 1)
local inf = math.huge * 2 + 1
--]]
local mz, z = -1/inf, 1/inf
assert(mz == z)
assert(1/mz < 0 and 0 < 1/z)
local NaN = inf - inf
assert(NaN ~= NaN)
assert(not (NaN < NaN))
assert(not (NaN <= NaN))
assert(not (NaN > NaN))
assert(not (NaN >= NaN))
assert(not (0 < NaN) and not (NaN < 0))
local NaN1 = 0/0
assert(NaN ~= NaN1 and not (NaN <= NaN1) and not (NaN1 <= NaN))
local a = {}
assert(not pcall(function () a[NaN] = 1 end))
assert(a[NaN] == nil)
a[1] = 1
assert(not pcall(function () a[NaN] = 1 end))
assert(a[NaN] == nil)
-- string with same binary representation as 0.0 (may create problems
-- for constant manipulation in the pre-compiler)
-- local a1, a2, a3, a4, a5 = 0, 0, "\0\0\0\0\0\0\0\0", 0, "\0\0\0\0\0\0\0\0"
-- assert(a1 == a2 and a2 == a4 and a1 ~= a3)
-- assert(a3 == a5)
end
if not _port then
print("testing 'math.random'")
math.randomseed(0)
local function aux (x1, x2, p)
local Max = -math.huge
local Min = math.huge
for i = 0, 20000 do
local t = math.random(table.unpack(p))
Max = math.max(Max, t)
Min = math.min(Min, t)
if eq(Max, x2, 0.001) and eq(Min, x1, 0.001) then
goto ok
end
end
-- loop ended without satisfing condition
assert(false)
::ok::
assert(x1 <= Min and Max<=x2)
end
aux(0, 1, {})
aux(-10, 0, {-10,0})
end
for i=1,10 do
local t = math.random(5)
assert(1 <= t and t <= 5)
end
print('OK')

Binary file not shown.

View File

@@ -0,0 +1,447 @@
print('testing tables, next, and for')
local a = {}
-- make sure table has lots of space in hash part
for i=1,100 do a[i.."+"] = true end
for i=1,100 do a[i.."+"] = nil end
-- fill hash part with numeric indices testing size operator
for i=1,100 do
a[i] = true
assert(#a == i)
end
-- testing ipairs
local x = 0
for k,v in ipairs{10,20,30;x=12} do
x = x + 1
assert(k == x and v == x * 10)
end
for _ in ipairs{x=12, y=24} do assert(nil) end
-- test for 'false' x ipair
x = false
local i = 0
for k,v in ipairs{true,false,true,false} do
i = i + 1
x = not x
assert(x == v)
end
assert(i == 4)
-- iterator function is always the same
assert(type(ipairs{}) == 'function' and ipairs{} == ipairs{})
if T then --[
-- testing table sizes
local function log2 (x) return math.log(x, 2) end
local function mp2 (n) -- minimum power of 2 >= n
local mp = 2^math.ceil(log2(n))
assert(n == 0 or (mp/2 < n and n <= mp))
return mp
end
local function fb (n)
local r, nn = T.int2fb(n)
assert(r < 256)
return nn
end
-- test fb function
local a = 1
local lim = 2^30
while a < lim do
local n = fb(a)
assert(a <= n and n <= a*1.125)
a = math.ceil(a*1.3)
end
local function check (t, na, nh)
local a, h = T.querytab(t)
if a ~= na or h ~= nh then
print(na, nh, a, h)
assert(nil)
end
end
-- testing C library sizes
do
local s = 0
for _ in pairs(math) do s = s + 1 end
check(math, 0, mp2(s))
end
-- testing constructor sizes
local lim = 40
local s = 'return {'
for i=1,lim do
s = s..i..','
local s = s
for k=0,lim do
local t = load(s..'}')()
assert(#t == i)
check(t, fb(i), mp2(k))
s = string.format('%sa%d=%d,', s, k, k)
end
end
-- tests with unknown number of elements
local a = {}
for i=1,lim do a[i] = i end -- build auxiliary table
for k=0,lim do
local a = {table.unpack(a,1,k)}
assert(#a == k)
check(a, k, 0)
a = {1,2,3,table.unpack(a,1,k)}
check(a, k+3, 0)
assert(#a == k + 3)
end
-- testing tables dynamically built
local lim = 130
local a = {}; a[2] = 1; check(a, 0, 1)
a = {}; a[0] = 1; check(a, 0, 1); a[2] = 1; check(a, 0, 2)
a = {}; a[0] = 1; a[1] = 1; check(a, 1, 1)
a = {}
for i = 1,lim do
a[i] = 1
assert(#a == i)
check(a, mp2(i), 0)
end
a = {}
for i = 1,lim do
a['a'..i] = 1
assert(#a == 0)
check(a, 0, mp2(i))
end
a = {}
for i=1,16 do a[i] = i end
check(a, 16, 0)
if not _port then
for i=1,11 do a[i] = nil end
for i=30,50 do a[i] = nil end -- force a rehash (?)
check(a, 0, 8) -- only 5 elements in the table
a[10] = 1
for i=30,50 do a[i] = nil end -- force a rehash (?)
check(a, 0, 8) -- only 6 elements in the table
for i=1,14 do a[i] = nil end
for i=18,50 do a[i] = nil end -- force a rehash (?)
check(a, 0, 4) -- only 2 elements ([15] and [16])
end
-- reverse filling
for i=1,lim do
local a = {}
for i=i,1,-1 do a[i] = i end -- fill in reverse
check(a, mp2(i), 0)
end
-- size tests for vararg
lim = 35
function foo (n, ...)
local arg = {...}
check(arg, n, 0)
assert(select('#', ...) == n)
arg[n+1] = true
check(arg, mp2(n+1), 0)
arg.x = true
check(arg, mp2(n+1), 1)
end
local a = {}
for i=1,lim do a[i] = true; foo(i, table.unpack(a)) end
end --]
-- test size operation on empty tables
assert(#{} == 0)
assert(#{nil} == 0)
assert(#{nil, nil} == 0)
assert(#{nil, nil, nil} == 0)
assert(#{nil, nil, nil, nil} == 0)
print'+'
local nofind = {}
a,b,c = 1,2,3
a,b,c = nil
-- next uses always the same iteraction function
assert(next{} == next{})
local function find (name)
local n,v
while 1 do
n,v = next(_G, n)
if not n then return nofind end
assert(v ~= nil)
if n == name then return v end
end
end
local function find1 (name)
for n,v in pairs(_G) do
if n==name then return v end
end
return nil -- not found
end
assert(print==find("print") and print == find1("print"))
assert(_G["print"]==find("print"))
assert(assert==find1("assert"))
assert(nofind==find("return"))
assert(not find1("return"))
_G["ret" .. "urn"] = nil
assert(nofind==find("return"))
_G["xxx"] = 1
assert(xxx==find("xxx"))
print('+')
a = {}
for i=0,10000 do
if math.fmod(i,10) ~= 0 then
a['x'..i] = i
end
end
n = {n=0}
for i,v in pairs(a) do
n.n = n.n+1
assert(i and v and a[i] == v)
end
assert(n.n == 9000)
a = nil
do -- clear global table
local a = {}
for n,v in pairs(_G) do a[n]=v end
for n,v in pairs(a) do
if not package.loaded[n] and type(v) ~= "function" and
not string.find(n, "^[%u_]") then
_G[n] = nil
end
collectgarbage()
end
end
--
local function checknext (a)
local b = {}
do local k,v = next(a); while k do b[k] = v; k,v = next(a,k) end end
for k,v in pairs(b) do assert(a[k] == v) end
for k,v in pairs(a) do assert(b[k] == v) end
end
checknext{1,x=1,y=2,z=3}
checknext{1,2,x=1,y=2,z=3}
checknext{1,2,3,x=1,y=2,z=3}
checknext{1,2,3,4,x=1,y=2,z=3}
checknext{1,2,3,4,5,x=1,y=2,z=3}
assert(#{} == 0)
assert(#{[-1] = 2} == 0)
assert(#{1,2,3,nil,nil} == 3)
for i=0,40 do
local a = {}
for j=1,i do a[j]=j end
assert(#a == i)
end
-- 'maxn' is now deprecated, but it is easily defined in Lua
function table.maxn (t)
local max = 0
for k in pairs(t) do
max = (type(k) == 'number') and math.max(max, k) or max
end
return max
end
assert(table.maxn{} == 0)
assert(table.maxn{["1000"] = true} == 0)
assert(table.maxn{["1000"] = true, [24.5] = 3} == 24.5)
assert(table.maxn{[1000] = true} == 1000)
assert(table.maxn{[10] = true, [100*math.pi] = print} == 100*math.pi)
table.maxn = nil
-- int overflow
a = {}
for i=0,50 do a[math.pow(2,i)] = true end
assert(a[#a])
print('+')
-- erasing values
local t = {[{1}] = 1, [{2}] = 2, [string.rep("x ", 4)] = 3,
[100.3] = 4, [4] = 5}
local n = 0
for k, v in pairs( t ) do
n = n+1
assert(t[k] == v)
t[k] = nil
collectgarbage()
assert(t[k] == nil)
end
assert(n == 5)
local function test (a)
table.insert(a, 10); table.insert(a, 2, 20);
table.insert(a, 1, -1); table.insert(a, 40);
table.insert(a, #a+1, 50)
table.insert(a, 2, -2)
assert(table.remove(a,1) == -1)
assert(table.remove(a,1) == -2)
assert(table.remove(a,1) == 10)
assert(table.remove(a,1) == 20)
assert(table.remove(a,1) == 40)
assert(table.remove(a,1) == 50)
assert(table.remove(a,1) == nil)
end
a = {n=0, [-7] = "ban"}
test(a)
assert(a.n == 0 and a[-7] == "ban")
a = {[-7] = "ban"};
test(a)
assert(a.n == nil and #a == 0 and a[-7] == "ban")
table.insert(a, 1, 10); table.insert(a, 1, 20); table.insert(a, 1, -1)
assert(table.remove(a) == 10)
assert(table.remove(a) == 20)
assert(table.remove(a) == -1)
a = {'c', 'd'}
table.insert(a, 3, 'a')
table.insert(a, 'b')
assert(table.remove(a, 1) == 'c')
assert(table.remove(a, 1) == 'd')
assert(table.remove(a, 1) == 'a')
assert(table.remove(a, 1) == 'b')
assert(#a == 0 and a.n == nil)
a = {10,20,30,40}
assert(table.remove(a, #a + 1) == nil and table.remove(a, 0) == nil)
assert(a[#a] == 40)
assert(table.remove(a, #a) == 40)
assert(a[#a] == 30)
assert(table.remove(a, 2) == 20)
assert(a[#a] == 30 and #a == 2)
print('+')
a = {}
for i=1,1000 do
a[i] = i; a[i-1] = nil
end
assert(next(a,nil) == 1000 and next(a,1000) == nil)
assert(next({}) == nil)
assert(next({}, nil) == nil)
for a,b in pairs{} do error"not here" end
for i=1,0 do error'not here' end
for i=0,1,-1 do error'not here' end
a = nil; for i=1,1 do assert(not a); a=1 end; assert(a)
a = nil; for i=1,1,-1 do assert(not a); a=1 end; assert(a)
if not _port then
print("testing precision in numeric for")
local a = 0; for i=0, 1, 0.1 do a=a+1 end; assert(a==11)
a = 0; for i=0, 0.999999999, 0.1 do a=a+1 end; assert(a==10)
a = 0; for i=1, 1, 1 do a=a+1 end; assert(a==1)
a = 0; for i=1e10, 1e10, -1 do a=a+1 end; assert(a==1)
a = 0; for i=1, 0.99999, 1 do a=a+1 end; assert(a==0)
a = 0; for i=99999, 1e5, -1 do a=a+1 end; assert(a==0)
a = 0; for i=1, 0.99999, -1 do a=a+1 end; assert(a==1)
end
-- conversion
a = 0; for i="10","1","-2" do a=a+1 end; assert(a==5)
collectgarbage()
-- testing generic 'for'
local function f (n, p)
local t = {}; for i=1,p do t[i] = i*10 end
return function (_,n)
if n > 0 then
n = n-1
return n, table.unpack(t)
end
end, nil, n
end
local x = 0
for n,a,b,c,d in f(5,3) do
x = x+1
assert(a == 10 and b == 20 and c == 30 and d == nil)
end
assert(x == 5)
-- testing __pairs and __ipairs metamethod
a = {}
do
local x,y,z = pairs(a)
assert(type(x) == 'function' and y == a and z == nil)
end
local function foo (e,i)
assert(e == a)
if i <= 10 then return i+1, i+2 end
end
local function foo1 (e,i)
i = i + 1
assert(e == a)
if i <= e.n then return i,a[i] end
end
setmetatable(a, {__pairs = function (x) return foo, x, 0 end})
local i = 0
for k,v in pairs(a) do
i = i + 1
assert(k == i and v == k+1)
end
a.n = 5
a[3] = 30
a = {n=10}
setmetatable(a, {__len = function (x) return x.n end,
__ipairs = function (x) return function (e,i)
if i < #e then return i+1 end
end, x, 0 end})
i = 0
for k,v in ipairs(a) do
i = i + 1
assert(k == i and v == nil)
end
assert(i == a.n)
print"OK"

Binary file not shown.

View File

@@ -0,0 +1,319 @@
print('testing pattern matching')
function f(s, p)
local i,e = string.find(s, p)
if i then return string.sub(s, i, e) end
end
function f1(s, p)
p = string.gsub(p, "%%([0-9])", function (s) return "%" .. (s+1) end)
p = string.gsub(p, "^(^?)", "%1()", 1)
p = string.gsub(p, "($?)$", "()%1", 1)
local t = {string.match(s, p)}
return string.sub(s, t[1], t[#t] - 1)
end
a,b = string.find('', '') -- empty patterns are tricky
assert(a == 1 and b == 0);
a,b = string.find('alo', '')
assert(a == 1 and b == 0)
a,b = string.find('a\0o a\0o a\0o', 'a', 1) -- first position
assert(a == 1 and b == 1)
a,b = string.find('a\0o a\0o a\0o', 'a\0o', 2) -- starts in the midle
assert(a == 5 and b == 7)
a,b = string.find('a\0o a\0o a\0o', 'a\0o', 9) -- starts in the midle
assert(a == 9 and b == 11)
a,b = string.find('a\0a\0a\0a\0\0ab', '\0ab', 2); -- finds at the end
assert(a == 9 and b == 11);
a,b = string.find('a\0a\0a\0a\0\0ab', 'b') -- last position
assert(a == 11 and b == 11)
assert(string.find('a\0a\0a\0a\0\0ab', 'b\0') == nil) -- check ending
assert(string.find('', '\0') == nil)
assert(string.find('alo123alo', '12') == 4)
assert(string.find('alo123alo', '^12') == nil)
assert(f('aloALO', '%l*') == 'alo')
assert(f('aLo_ALO', '%a*') == 'aLo')
assert(f(" \n\r*&\n\r xuxu \n\n", "%g%g%g+") == "xuxu")
assert(f('aaab', 'a*') == 'aaa');
assert(f('aaa', '^.*$') == 'aaa');
assert(f('aaa', 'b*') == '');
assert(f('aaa', 'ab*a') == 'aa')
assert(f('aba', 'ab*a') == 'aba')
assert(f('aaab', 'a+') == 'aaa')
assert(f('aaa', '^.+$') == 'aaa')
assert(f('aaa', 'b+') == nil)
assert(f('aaa', 'ab+a') == nil)
assert(f('aba', 'ab+a') == 'aba')
assert(f('a$a', '.$') == 'a')
assert(f('a$a', '.%$') == 'a$')
assert(f('a$a', '.$.') == 'a$a')
assert(f('a$a', '$$') == nil)
assert(f('a$b', 'a$') == nil)
assert(f('a$a', '$') == '')
assert(f('', 'b*') == '')
assert(f('aaa', 'bb*') == nil)
assert(f('aaab', 'a-') == '')
assert(f('aaa', '^.-$') == 'aaa')
assert(f('aabaaabaaabaaaba', 'b.*b') == 'baaabaaabaaab')
assert(f('aabaaabaaabaaaba', 'b.-b') == 'baaab')
assert(f('alo xo', '.o$') == 'xo')
assert(f(' \n isto é assim', '%S%S*') == 'isto')
assert(f(' \n isto é assim', '%S*$') == 'assim')
assert(f(' \n isto é assim', '[a-z]*$') == 'assim')
assert(f('um caracter ? extra', '[^%sa-z]') == '?')
assert(f('', 'a?') == '')
assert(f('á', 'á?') == 'á')
assert(f('ábl', 'á?b?l?') == 'ábl')
assert(f(' ábl', 'á?b?l?') == '')
assert(f('aa', '^aa?a?a') == 'aa')
assert(f(']]]áb', '[^]]') == 'á')
assert(f("0alo alo", "%x*") == "0a")
assert(f("alo alo", "%C+") == "alo alo")
print('+')
assert(f1('alo alx 123 b\0o b\0o', '(..*) %1') == "b\0o b\0o")
assert(f1('axz123= 4= 4 34', '(.+)=(.*)=%2 %1') == '3= 4= 4 3')
assert(f1('=======', '^(=*)=%1$') == '=======')
assert(string.match('==========', '^([=]*)=%1$') == nil)
local function range (i, j)
if i <= j then
return i, range(i+1, j)
end
end
local abc = string.char(range(0, 255));
assert(string.len(abc) == 256)
function strset (p)
local res = {s=''}
string.gsub(abc, p, function (c) res.s = res.s .. c end)
return res.s
end;
assert(string.len(strset('[\200-\210]')) == 11)
assert(strset('[a-z]') == "abcdefghijklmnopqrstuvwxyz")
assert(strset('[a-z%d]') == strset('[%da-uu-z]'))
assert(strset('[a-]') == "-a")
assert(strset('[^%W]') == strset('[%w]'))
assert(strset('[]%%]') == '%]')
assert(strset('[a%-z]') == '-az')
assert(strset('[%^%[%-a%]%-b]') == '-[]^ab')
assert(strset('%Z') == strset('[\1-\255]'))
assert(strset('.') == strset('[\1-\255%z]'))
print('+');
assert(string.match("alo xyzK", "(%w+)K") == "xyz")
assert(string.match("254 K", "(%d*)K") == "")
assert(string.match("alo ", "(%w*)$") == "")
assert(string.match("alo ", "(%w+)$") == nil)
assert(string.find("(álo)", "%(á") == 1)
local a, b, c, d, e = string.match("âlo alo", "^(((.).).* (%w*))$")
assert(a == 'âlo alo' and b == 'âl' and c == 'â' and d == 'alo' and e == nil)
a, b, c, d = string.match('0123456789', '(.+(.?)())')
assert(a == '0123456789' and b == '' and c == 11 and d == nil)
print('+')
assert(string.gsub('ülo ülo', 'ü', 'x') == 'xlo xlo')
assert(string.gsub('alo úlo ', ' +$', '') == 'alo úlo') -- trim
assert(string.gsub(' alo alo ', '^%s*(.-)%s*$', '%1') == 'alo alo') -- double trim
assert(string.gsub('alo alo \n 123\n ', '%s+', ' ') == 'alo alo 123 ')
t = "abç d"
a, b = string.gsub(t, '(.)', '%1@')
assert('@'..a == string.gsub(t, '', '@') and b == 5)
a, b = string.gsub('abçd', '(.)', '%0@', 2)
assert(a == 'a@b@çd' and b == 2)
assert(string.gsub('alo alo', '()[al]', '%1') == '12o 56o')
assert(string.gsub("abc=xyz", "(%w*)(%p)(%w+)", "%3%2%1-%0") ==
"xyz=abc-abc=xyz")
assert(string.gsub("abc", "%w", "%1%0") == "aabbcc")
assert(string.gsub("abc", "%w+", "%0%1") == "abcabc")
assert(string.gsub('áéí', '$', '\0óú') == 'áéí\0óú')
assert(string.gsub('', '^', 'r') == 'r')
assert(string.gsub('', '$', 'r') == 'r')
print('+')
assert(string.gsub("um (dois) tres (quatro)", "(%(%w+%))", string.upper) ==
"um (DOIS) tres (QUATRO)")
do
local function setglobal (n,v) rawset(_G, n, v) end
string.gsub("a=roberto,roberto=a", "(%w+)=(%w%w*)", setglobal)
assert(_G.a=="roberto" and _G.roberto=="a")
end
function f(a,b) return string.gsub(a,'.',b) end
assert(string.gsub("trocar tudo em |teste|b| é |beleza|al|", "|([^|]*)|([^|]*)|", f) ==
"trocar tudo em bbbbb é alalalalalal")
local function dostring (s) return load(s)() or "" end
assert(string.gsub("alo $a=1$ novamente $return a$", "$([^$]*)%$", dostring) ==
"alo novamente 1")
x = string.gsub("$x=string.gsub('alo', '.', string.upper)$ assim vai para $return x$",
"$([^$]*)%$", dostring)
assert(x == ' assim vai para ALO')
t = {}
s = 'a alo jose joao'
r = string.gsub(s, '()(%w+)()', function (a,w,b)
assert(string.len(w) == b-a);
t[a] = b-a;
end)
assert(s == r and t[1] == 1 and t[3] == 3 and t[7] == 4 and t[13] == 4)
function isbalanced (s)
return string.find(string.gsub(s, "%b()", ""), "[()]") == nil
end
assert(isbalanced("(9 ((8))(\0) 7) \0\0 a b ()(c)() a"))
assert(not isbalanced("(9 ((8) 7) a b (\0 c) a"))
assert(string.gsub("alo 'oi' alo", "%b''", '"') == 'alo " alo')
local t = {"apple", "orange", "lime"; n=0}
assert(string.gsub("x and x and x", "x", function () t.n=t.n+1; return t[t.n] end)
== "apple and orange and lime")
t = {n=0}
string.gsub("first second word", "%w%w*", function (w) t.n=t.n+1; t[t.n] = w end)
assert(t[1] == "first" and t[2] == "second" and t[3] == "word" and t.n == 3)
t = {n=0}
assert(string.gsub("first second word", "%w+",
function (w) t.n=t.n+1; t[t.n] = w end, 2) == "first second word")
assert(t[1] == "first" and t[2] == "second" and t[3] == nil)
assert(not pcall(string.gsub, "alo", "(.", print))
assert(not pcall(string.gsub, "alo", ".)", print))
assert(not pcall(string.gsub, "alo", "(.", {}))
assert(not pcall(string.gsub, "alo", "(.)", "%2"))
assert(not pcall(string.gsub, "alo", "(%1)", "a"))
assert(not pcall(string.gsub, "alo", "(%0)", "a"))
if not _soft then
-- big strings
local a = string.rep('a', 300000)
assert(string.find(a, '^a*.?$'))
assert(not string.find(a, '^a*.?b$'))
assert(string.find(a, '^a-.?$'))
-- bug in 5.1.2
a = string.rep('a', 10000) .. string.rep('b', 10000)
assert(not pcall(string.gsub, a, 'b'))
end
-- recursive nest of gsubs
function rev (s)
return string.gsub(s, "(.)(.+)", function (c,s1) return rev(s1)..c end)
end
local x = "abcdef"
assert(rev(rev(x)) == x)
-- gsub with tables
assert(string.gsub("alo alo", ".", {}) == "alo alo")
assert(string.gsub("alo alo", "(.)", {a="AA", l=""}) == "AAo AAo")
assert(string.gsub("alo alo", "(.).", {a="AA", l="K"}) == "AAo AAo")
assert(string.gsub("alo alo", "((.)(.?))", {al="AA", o=false}) == "AAo AAo")
assert(string.gsub("alo alo", "().", {2,5,6}) == "256 alo")
t = {}; setmetatable(t, {__index = function (t,s) return string.upper(s) end})
assert(string.gsub("a alo b hi", "%w%w+", t) == "a ALO b HI")
-- tests for gmatch
local a = 0
for i in string.gmatch('abcde', '()') do assert(i == a+1); a=i end
assert(a==6)
t = {n=0}
for w in string.gmatch("first second word", "%w+") do
t.n=t.n+1; t[t.n] = w
end
assert(t[1] == "first" and t[2] == "second" and t[3] == "word")
t = {3, 6, 9}
for i in string.gmatch ("xuxx uu ppar r", "()(.)%2") do
assert(i == table.remove(t, 1))
end
assert(#t == 0)
t = {}
for i,j in string.gmatch("13 14 10 = 11, 15= 16, 22=23", "(%d+)%s*=%s*(%d+)") do
t[i] = j
end
a = 0
for k,v in pairs(t) do assert(k+1 == v+0); a=a+1 end
assert(a == 3)
-- tests for `%f' (`frontiers')
assert(string.gsub("aaa aa a aaa a", "%f[%w]a", "x") == "xaa xa x xaa x")
assert(string.gsub("[[]] [][] [[[[", "%f[[].", "x") == "x[]] x]x] x[[[")
assert(string.gsub("01abc45de3", "%f[%d]", ".") == ".01abc.45de.3")
assert(string.gsub("01abc45 de3x", "%f[%D]%w", ".") == "01.bc45 de3.")
assert(string.gsub("function", "%f[\1-\255]%w", ".") == ".unction")
assert(string.gsub("function", "%f[^\1-\255]", ".") == "function.")
assert(string.find("a", "%f[a]") == 1)
assert(string.find("a", "%f[^%z]") == 1)
assert(string.find("a", "%f[^%l]") == 2)
assert(string.find("aba", "%f[a%z]") == 3)
assert(string.find("aba", "%f[%z]") == 4)
assert(not string.find("aba", "%f[%l%z]"))
assert(not string.find("aba", "%f[^%l%z]"))
local i, e = string.find(" alo aalo allo", "%f[%S].-%f[%s].-%f[%S]")
assert(i == 2 and e == 5)
local k = string.match(" alo aalo allo", "%f[%S](.-%f[%s].-%f[%S])")
assert(k == 'alo ')
local a = {1, 5, 9, 14, 17,}
for k in string.gmatch("alo alo th02 is 1hat", "()%f[%w%d]") do
assert(table.remove(a, 1) == k)
end
assert(#a == 0)
-- malformed patterns
local function malform (p, m)
m = m or "malformed"
local r, msg = pcall(string.find, "a", p)
assert(not r and string.find(msg, m))
end
malform("[a")
malform("[]")
malform("[^]")
malform("[a%]")
malform("[a%")
malform("%b")
malform("%ba")
malform("%")
malform("%f", "missing")
-- \0 in patterns
assert(string.match("ab\0\1\2c", "[\0-\2]+") == "\0\1\2")
assert(string.match("ab\0\1\2c", "[\0-\0]+") == "\0")
assert(string.find("b$a", "$\0?") == 2)
assert(string.find("abc\0efg", "%\0") == 4)
assert(string.match("abc\0efg\0\1e\1g", "%b\0\1") == "\0efg\0\1e\1")
assert(string.match("abc\0\0\0", "%\0+") == "\0\0\0")
assert(string.match("abc\0\0\0", "%\0%\0?") == "\0\0")
-- magic char after \0
assert(string.find("abc\0\0","\0.") == 4)
assert(string.find("abcx\0\0abc\0abc","x\0\0abc\0a.") == 4)
print('OK')

Binary file not shown.

View File

@@ -0,0 +1,167 @@
print "testing (parts of) table library"
print "testing unpack"
local unpack = table.unpack
local x,y,z,a,n
a = {}; lim = 2000
for i=1, lim do a[i]=i end
assert(select(lim, unpack(a)) == lim and select('#', unpack(a)) == lim)
x = unpack(a)
assert(x == 1)
x = {unpack(a)}
assert(#x == lim and x[1] == 1 and x[lim] == lim)
x = {unpack(a, lim-2)}
assert(#x == 3 and x[1] == lim-2 and x[3] == lim)
x = {unpack(a, 10, 6)}
assert(next(x) == nil) -- no elements
x = {unpack(a, 11, 10)}
assert(next(x) == nil) -- no elements
x,y = unpack(a, 10, 10)
assert(x == 10 and y == nil)
x,y,z = unpack(a, 10, 11)
assert(x == 10 and y == 11 and z == nil)
a,x = unpack{1}
assert(a==1 and x==nil)
a,x = unpack({1,2}, 1, 1)
assert(a==1 and x==nil)
if not _no32 then
assert(not pcall(unpack, {}, 0, 2^31-1))
assert(not pcall(unpack, {}, 1, 2^31-1))
assert(not pcall(unpack, {}, -(2^31), 2^31-1))
assert(not pcall(unpack, {}, -(2^31 - 1), 2^31-1))
assert(pcall(unpack, {}, 2^31-1, 0))
assert(pcall(unpack, {}, 2^31-1, 1))
pcall(unpack, {}, 1, 2^31)
a, b = unpack({[2^31-1] = 20}, 2^31-1, 2^31-1)
assert(a == 20 and b == nil)
a, b = unpack({[2^31-1] = 20}, 2^31-2, 2^31-1)
assert(a == nil and b == 20)
end
print "testing pack"
a = table.pack()
assert(a[1] == nil and a.n == 0)
a = table.pack(table)
assert(a[1] == table and a.n == 1)
a = table.pack(nil, nil, nil, nil)
assert(a[1] == nil and a.n == 4)
print"testing sort"
-- test checks for invalid order functions
local function check (t)
local function f(a, b) assert(a and b); return true end
local s, e = pcall(table.sort, t, f)
assert(not s and e:find("invalid order function"))
end
check{1,2,3,4}
check{1,2,3,4,5}
check{1,2,3,4,5,6}
function check (a, f)
f = f or function (x,y) return x<y end;
for n = #a, 2, -1 do
assert(not f(a[n], a[n-1]))
end
end
a = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
"Oct", "Nov", "Dec"}
table.sort(a)
check(a)
function perm (s, n)
n = n or #s
if n == 1 then
local t = {unpack(s)}
table.sort(t)
check(t)
else
for i = 1, n do
s[i], s[n] = s[n], s[i]
perm(s, n - 1)
s[i], s[n] = s[n], s[i]
end
end
end
perm{}
perm{1}
perm{1,2}
perm{1,2,3}
perm{1,2,3,4}
perm{2,2,3,4}
perm{1,2,3,4,5}
perm{1,2,3,3,5}
perm{1,2,3,4,5,6}
perm{2,2,3,3,5,6}
limit = 30000
if _soft then limit = 5000 end
a = {}
for i=1,limit do
a[i] = math.random()
end
local x = os.clock()
table.sort(a)
print(string.format("Sorting %d elements in %.2f sec.", limit, os.clock()-x))
check(a)
x = os.clock()
table.sort(a)
print(string.format("Re-sorting %d elements in %.2f sec.", limit, os.clock()-x))
check(a)
a = {}
for i=1,limit do
a[i] = math.random()
end
x = os.clock(); i=0
table.sort(a, function(x,y) i=i+1; return y<x end)
print(string.format("Invert-sorting other %d elements in %.2f sec., with %i comparisons",
limit, os.clock()-x, i))
check(a, function(x,y) return y<x end)
table.sort{} -- empty array
for i=1,limit do a[i] = false end
x = os.clock();
table.sort(a, function(x,y) return nil end)
print(string.format("Sorting %d equal elements in %.2f sec.", limit, os.clock()-x))
check(a, function(x,y) return nil end)
for i,v in pairs(a) do assert(not v or i=='n' and v==limit) end
A = {"álo", "\0first :-)", "alo", "then this one", "45", "and a new"}
table.sort(A)
check(A)
table.sort(A, function (x, y)
load(string.format("A[%q] = ''", x))()
collectgarbage()
return x<y
end)
tt = {__lt = function (a,b) return a.val < b.val end}
a = {}
for i=1,10 do a[i] = {val=math.random(100)}; setmetatable(a[i], tt); end
table.sort(a)
check(a, tt.__lt)
check(a)
print"OK"

Binary file not shown.

View File

@@ -0,0 +1,281 @@
print('testing strings and string library')
assert('alo' < 'alo1')
assert('' < 'a')
assert('alo\0alo' < 'alo\0b')
assert('alo\0alo\0\0' > 'alo\0alo\0')
assert('alo' < 'alo\0')
assert('alo\0' > 'alo')
assert('\0' < '\1')
assert('\0\0' < '\0\1')
assert('\1\0a\0a' <= '\1\0a\0a')
assert(not ('\1\0a\0b' <= '\1\0a\0a'))
assert('\0\0\0' < '\0\0\0\0')
assert(not('\0\0\0\0' < '\0\0\0'))
assert('\0\0\0' <= '\0\0\0\0')
assert(not('\0\0\0\0' <= '\0\0\0'))
assert('\0\0\0' <= '\0\0\0')
assert('\0\0\0' >= '\0\0\0')
assert(not ('\0\0b' < '\0\0a\0'))
print('+')
assert(string.sub("123456789",2,4) == "234")
assert(string.sub("123456789",7) == "789")
assert(string.sub("123456789",7,6) == "")
assert(string.sub("123456789",7,7) == "7")
assert(string.sub("123456789",0,0) == "")
assert(string.sub("123456789",-10,10) == "123456789")
assert(string.sub("123456789",1,9) == "123456789")
assert(string.sub("123456789",-10,-20) == "")
assert(string.sub("123456789",-1) == "9")
assert(string.sub("123456789",-4) == "6789")
assert(string.sub("123456789",-6, -4) == "456")
if not _no32 then
assert(string.sub("123456789",-2^31, -4) == "123456")
assert(string.sub("123456789",-2^31, 2^31 - 1) == "123456789")
assert(string.sub("123456789",-2^31, -2^31) == "")
end
assert(string.sub("\000123456789",3,5) == "234")
assert(("\000123456789"):sub(8) == "789")
print('+')
assert(string.find("123456789", "345") == 3)
a,b = string.find("123456789", "345")
assert(string.sub("123456789", a, b) == "345")
assert(string.find("1234567890123456789", "345", 3) == 3)
assert(string.find("1234567890123456789", "345", 4) == 13)
assert(string.find("1234567890123456789", "346", 4) == nil)
assert(string.find("1234567890123456789", ".45", -9) == 13)
assert(string.find("abcdefg", "\0", 5, 1) == nil)
assert(string.find("", "") == 1)
assert(string.find("", "", 1) == 1)
assert(not string.find("", "", 2))
assert(string.find('', 'aaa', 1) == nil)
assert(('alo(.)alo'):find('(.)', 1, 1) == 4)
print('+')
assert(string.len("") == 0)
assert(string.len("\0\0\0") == 3)
assert(string.len("1234567890") == 10)
assert(#"" == 0)
assert(#"\0\0\0" == 3)
assert(#"1234567890" == 10)
assert(string.byte("a") == 97)
assert(string.byte("\xe4") > 127)
assert(string.byte(string.char(255)) == 255)
assert(string.byte(string.char(0)) == 0)
assert(string.byte("\0") == 0)
assert(string.byte("\0\0alo\0x", -1) == string.byte('x'))
assert(string.byte("ba", 2) == 97)
assert(string.byte("\n\n", 2, -1) == 10)
assert(string.byte("\n\n", 2, 2) == 10)
assert(string.byte("") == nil)
assert(string.byte("hi", -3) == nil)
assert(string.byte("hi", 3) == nil)
assert(string.byte("hi", 9, 10) == nil)
assert(string.byte("hi", 2, 1) == nil)
assert(string.char() == "")
assert(string.char(0, 255, 0) == "\0\255\0")
assert(string.char(0, string.byte("\xe4"), 0) == "\0\xe4\0")
assert(string.char(string.byte("\xe4l\0óu", 1, -1)) == "\xe4l\0óu")
assert(string.char(string.byte("\xe4l\0óu", 1, 0)) == "")
assert(string.char(string.byte("\xe4l\0óu", -10, 100)) == "\xe4l\0óu")
print('+')
assert(string.upper("ab\0c") == "AB\0C")
assert(string.lower("\0ABCc%$") == "\0abcc%$")
assert(string.rep('teste', 0) == '')
assert(string.rep('tés\00', 2) == 'tés\0têtés\000')
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')

Binary file not shown.

View File

@@ -0,0 +1,125 @@
print('testing vararg')
_G.arg = nil
function f(a, ...)
local arg = {n = select('#', ...), ...}
for i=1,arg.n do assert(a[i]==arg[i]) end
return arg.n
end
function c12 (...)
assert(arg == nil)
local x = {...}; x.n = #x
local res = (x.n==2 and x[1] == 1 and x[2] == 2)
if res then res = 55 end
return res, 2
end
function vararg (...) return {n = select('#', ...), ...} end
local call = function (f, args) return f(table.unpack(args, 1, args.n)) end
assert(f() == 0)
assert(f({1,2,3}, 1, 2, 3) == 3)
assert(f({"alo", nil, 45, f, nil}, "alo", nil, 45, f, nil) == 5)
assert(c12(1,2)==55)
a,b = assert(call(c12, {1,2}))
assert(a == 55 and b == 2)
a = call(c12, {1,2;n=2})
assert(a == 55 and b == 2)
a = call(c12, {1,2;n=1})
assert(not a)
assert(c12(1,2,3) == false)
local a = vararg(call(next, {_G,nil;n=2}))
local b,c = next(_G)
assert(a[1] == b and a[2] == c and a.n == 2)
a = vararg(call(call, {c12, {1,2}}))
assert(a.n == 2 and a[1] == 55 and a[2] == 2)
a = call(print, {'+'})
assert(a == nil)
local t = {1, 10}
function t:f (...) local arg = {...}; return self[...]+#arg end
assert(t:f(1,4) == 3 and t:f(2) == 11)
print('+')
lim = 20
local i, a = 1, {}
while i <= lim do a[i] = i+0.3; i=i+1 end
function f(a, b, c, d, ...)
local more = {...}
assert(a == 1.3 and more[1] == 5.3 and
more[lim-4] == lim+0.3 and not more[lim-3])
end
function g(a,b,c)
assert(a == 1.3 and b == 2.3 and c == 3.3)
end
call(f, a)
call(g, a)
a = {}
i = 1
while i <= lim do a[i] = i; i=i+1 end
assert(call(math.max, a) == lim)
print("+")
-- new-style varargs
function oneless (a, ...) return ... end
function f (n, a, ...)
local b
assert(arg == nil)
if n == 0 then
local b, c, d = ...
return a, b, c, d, oneless(oneless(oneless(...)))
else
n, b, a = n-1, ..., a
assert(b == ...)
return f(n, a, ...)
end
end
a,b,c,d,e = assert(f(10,5,4,3,2,1))
assert(a==5 and b==4 and c==3 and d==2 and e==1)
a,b,c,d,e = f(4)
assert(a==nil and b==nil and c==nil and d==nil and e==nil)
-- varargs for main chunks
f = load[[ return {...} ]]
x = f(2,3)
assert(x[1] == 2 and x[2] == 3 and x[3] == nil)
f = load[[
local x = {...}
for i=1,select('#', ...) do assert(x[i] == select(i, ...)) end
assert(x[select('#', ...)+1] == nil)
return true
]]
assert(f("a", "b", nil, {}, assert))
assert(f())
a = {select(3, table.unpack{10,20,30,40})}
assert(#a == 2 and a[1] == 30 and a[2] == 40)
a = {select(1)}
assert(next(a) == nil)
a = {select(-1, 3, 5, 7)}
assert(a[1] == 7 and a[2] == nil)
a = {select(-2, 3, 5, 7)}
assert(a[1] == 5 and a[2] == 7 and a[3] == nil)
pcall(select, 10000)
pcall(select, -10000)
print('OK')

Binary file not shown.

View File

@@ -0,0 +1,144 @@
print "testing RK"
-- testing opcodes with RK arguments larger than K limit
local function foo ()
local dummy = {
-- fill first 256 entries in table of constants
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
97, 98, 99, 100, 101, 102, 103, 104,
105, 106, 107, 108, 109, 110, 111, 112,
113, 114, 115, 116, 117, 118, 119, 120,
121, 122, 123, 124, 125, 126, 127, 128,
129, 130, 131, 132, 133, 134, 135, 136,
137, 138, 139, 140, 141, 142, 143, 144,
145, 146, 147, 148, 149, 150, 151, 152,
153, 154, 155, 156, 157, 158, 159, 160,
161, 162, 163, 164, 165, 166, 167, 168,
169, 170, 171, 172, 173, 174, 175, 176,
177, 178, 179, 180, 181, 182, 183, 184,
185, 186, 187, 188, 189, 190, 191, 192,
193, 194, 195, 196, 197, 198, 199, 200,
201, 202, 203, 204, 205, 206, 207, 208,
209, 210, 211, 212, 213, 214, 215, 216,
217, 218, 219, 220, 221, 222, 223, 224,
225, 226, 227, 228, 229, 230, 231, 232,
233, 234, 235, 236, 237, 238, 239, 240,
241, 242, 243, 244, 245, 246, 247, 248,
249, 250, 251, 252, 253, 254, 255, 256,
}
assert(24.5 + 0.6 == 25.1)
local t = {foo = function (self, x) return x + self.x end, x = 10}
t.t = t
assert(t:foo(1.5) == 11.5)
assert(t.t:foo(0.5) == 10.5) -- bug in 5.2 alpha
assert(24.3 == 24.3)
assert((function () return t.x end)() == 10)
end
foo()
foo = nil
if _soft then return 10 end
print "testing large programs (>64k)"
-- template to create a very big test file
prog = [[$
local a,b
b = {$1$
b30009 = 65534,
b30010 = 65535,
b30011 = 65536,
b30012 = 65537,
b30013 = 16777214,
b30014 = 16777215,
b30015 = 16777216,
b30016 = 16777217,
b30017 = 4294967294,
b30018 = 4294967295,
b30019 = 4294967296,
b30020 = 4294967297,
b30021 = -65534,
b30022 = -65535,
b30023 = -65536,
b30024 = -4294967297,
b30025 = 15012.5,
$2$
};
assert(b.a50008 == 25004 and b["a11"] == 5.5)
assert(b.a33007 == 16503.5 and b.a50009 == 25004.5)
assert(b["b"..30024] == -4294967297)
function b:xxx (a,b) return a+b end
assert(b:xxx(10, 12) == 22) -- pushself with non-constant index
b.xxx = nil
s = 0; n=0
for a,b in pairs(b) do s=s+b; n=n+1 end
assert(s==13977183656.5 and n==70001)
a = nil; b = nil
print'+'
function f(x) b=x end
a = f{$3$} or 10
assert(a==10)
assert(b[1] == "a10" and b[2] == 5 and b[#b-1] == "a50009")
function xxxx (x) return b[x] end
assert(xxxx(3) == "a11")
a = nil; b=nil
xxxx = nil
return 10
]]
-- functions to fill in the $n$
F = {
function () -- $1$
for i=10,50009 do
io.write('a', i, ' = ', 5+((i-10)/2), ',\n')
end
end,
function () -- $2$
for i=30026,50009 do
io.write('b', i, ' = ', 15013+((i-30026)/2), ',\n')
end
end,
function () -- $3$
for i=10,50009 do
io.write('"a', i, '", ', 5+((i-10)/2), ',\n')
end
end,
}
file = os.tmpname()
io.output(file)
for s in string.gmatch(prog, "$([^$]+)") do
local n = tonumber(s)
if not n then io.write(s) else F[n]() end
end
io.close()
result = dofile(file)
assert(os.remove(file))
print'OK'
return result

View File

@@ -0,0 +1,277 @@
-- tostring replacement that assigns ids
local ts,id,nid,types = tostring,{},0,{table='tbl',thread='thr',userdata='uda',['function']='func'}
tostring = function(x)
if not x or not types[type(x)] then return ts(x) end
if not id[x] then nid=nid+1; id[x]=types[type(x)]..'.'..nid end
return id[x]
end
-- wrap pcall to return one result
-- error message are tested elsewhere
local pc = pcall
local pcall = function(...)
local s,e = pc(...)
if s then return e end
return false, type(e)
end
-- print
print()
print(11)
print("abc",123,nil,"pqr")
print( nil and 'T' or 'F' )
print( false and 'T' or 'F' )
print( 0 and 'T' or 'F' )
-- assert
print( 'assert(true)', assert(true) )
print( 'pcall(assert,true)', pcall(assert,true) )
print( 'pcall(assert,false)', pcall(assert,false) )
print( 'pcall(assert,nil)', pcall(assert,nil) )
print( 'pcall(assert,true,"msg")', pcall(assert,true,"msg") )
print( 'pcall(assert,false,"msg")', pcall(assert,false,"msg") )
print( 'pcall(assert,nil,"msg")', pcall(assert,nil,"msg") )
print( 'pcall(assert,false,"msg","msg2")', pcall(assert,false,"msg","msg2") )
-- collectgarbage (not supported)
print( 'collectgarbage("count")', type(collectgarbage("count")))
print( 'collectgarbage("collect")', type(collectgarbage("collect")))
print( 'collectgarbage("count")', type(collectgarbage("count")))
-- dofile (not supported)
-- ipairs
print( 'pcall(ipairs)', pcall(ipairs) )
print( 'pcall(ipairs,nil)', pcall(ipairs,nil) )
print( 'pcall(ipairs,"a")', pcall(ipairs,"a") )
print( 'pcall(ipairs,1)', pcall(ipairs,1) )
for k,v in ipairs({}) do print('ipairs1',k,v)end
for k,v in ipairs({'one','two'}) do print('ipairs2',k,v)end
for k,v in ipairs({aa='aaa',bb='bbb'}) do print('ipairs3',k,v)end
for k,v in ipairs({aa='aaa',bb='bbb','one','two'}) do print('ipairs4',k,v)end
for k,v in ipairs({[30]='30',[20]='20'}) do print('ipairs5',k,v)end
-- load
t = { "print ", "'table ", "loaded'", "", " print'after empty string'" }
i = 0
f = function() i = i + 1; return t[i]; end
c,e = load(f)
if c then print('load: ', pcall(c)) else print('load failed:', e) end
-- loadfile
-- load
local lst = "print(3+4); return 8"
local chunk, err = load( lst )
print( 'load("'..lst..'")', chunk, err )
print( 'load("'..lst..'")()', chunk() )
-- pairs
print( 'pcall(pairs)', pcall(pairs) )
print( 'pcall(pairs,nil)', pcall(pairs,nil) )
print( 'pcall(pairs,"a")', pcall(pairs,"a") )
print( 'pcall(pairs,1)', pcall(pairs,1) )
for k,v in pairs({}) do print('pairs1',k,v)end
for k,v in pairs({'one','two'}) do print('pairs2',k,v)end
for k,v in pairs({aa='aaa'}) do print('pairs3',k,v)end
for k,v in pairs({aa='aaa','one','two'}) do print('pairs4',k,v)end
for k,v in pairs({[20]='30',[30]='20'}) do print('pairs5',k,v)end
-- _G
print( '_G["abc"] (before)', _G["abc"] )
abc='def'
print( '_G["abc"] (after)', _G["abc"] )
-- type
print( 'type(nil)', type(nil) )
print( 'type("a")', type("a") )
print( 'type(1)', type(1) )
print( 'type(1.5)', type(1.5) )
print( 'type(function() end)', type(function() end) )
print( 'type({})', type({}) )
print( 'type(true)', type(true) )
print( 'type(false)', type(false) )
print( 'pcall(type,type)', pcall(type,type) )
print( 'pcall(type)', pcall(type) )
print( '(function() return pcall(type) end)()', (function() return pcall(type) end)() )
local function la() return pcall(type) end
print( 'la()', la() )
function ga() return pcall(type) end
print( 'ga()', ga() )
-- getmetatable, setmetatable
ta = { aa1="aaa1", aa2="aaa2" }
tb = { bb1="bbb1", bb2="bbb2" }
print( 'getmetatable(ta)', getmetatable(ta) )
print( 'getmetatable(tb)', getmetatable(tb) )
print( 'setmetatable(ta),{cc1="ccc1"}', type( setmetatable(ta,{cc1="ccc1"}) ) )
print( 'setmetatable(tb),{dd1="ddd1"}', type( setmetatable(tb,{dd1="ddd1"}) ) )
print( 'getmetatable(ta)["cc1"]', getmetatable(ta)["cc1"] )
print( 'getmetatable(tb)["dd1"]', getmetatable(tb)["dd1"] )
print( 'getmetatable(1)', getmetatable(1) )
print( 'pcall(setmetatable,1)', pcall(setmetatable,1) )
print( 'pcall(setmetatable,nil)', pcall(setmetatable,nil) )
print( 'pcall(setmetatable,"ABC")', pcall(setmetatable,"ABC") )
print( 'pcall(setmetatable,function() end)', pcall(setmetatable,function() end) )
-- rawget,rawset
local mt = {aa="aaa", bb="bbb"}
mt.__index = mt
mt.__newindex = mt
local s = {cc="ccc", dd="ddd", }
local t = {cc="ccc", dd="ddd"}
setmetatable(t,mt)
print( 'pcall(rawget)', pcall(rawget))
print( 'pcall(rawget,"a")', pcall(rawget,"a"))
print( 'pcall(rawget,s)', pcall(rawget,s))
print( 'pcall(rawget,t)', pcall(rawget,t))
function printtables()
function printtable(name,t)
print( ' '..name, t["aa"], t["bb"], t["cc"], t["dd"], t["ee"], t["ff"], t["gg"] )
print( ' '..name,
rawget(t,"aa"),
rawget(t,"bb"),
rawget(t,"cc"),
rawget(t,"dd"),
rawget(t,"ee"),
rawget(t,"ff"),
rawget(t,"gg") )
end
printtable( 's', s )
printtable( 't', t )
printtable( 'mt', mt )
end
printtables()
print( 'pcall(rawset,s,"aa","www")', rawset(s,"aa","www"))
printtables()
print( 'pcall(rawset,s,"cc","xxx")', rawset(s,"cc","xxx"))
printtables()
print( 'pcall(rawset,t,"aa","yyy")', rawset(t,"aa","yyy"))
printtables()
print( 'pcall(rawset,t,"dd","zzz")', rawset(t,"dd","zzz"))
printtables()
-- rawlen
print( 'pcall(rawlen, {})', pcall(rawlen, {}))
print( 'pcall(rawlen, {"a"})', pcall(rawlen, {'a'}))
print( 'pcall(rawlen, {"a","b"})', pcall(rawlen, {'a','b'}))
print( 'pcall(rawlen, "")', pcall(rawlen, ""))
print( 'pcall(rawlen, "a")', pcall(rawlen, 'a'))
print( 'pcall(rawlen, "ab")', pcall(rawlen, 'ab'))
print( 'pcall(rawlen, 1)', pcall(rawlen, 1))
print( 'pcall(rawlen, nil)', pcall(rawlen, nil))
print( 'pcall(rawlen)', pcall(rawlen))
printtables()
print( 's["ee"]="ppp"' ); s["ee"]="ppp"
printtables()
print( 's["cc"]="qqq"' ); s["cc"]="qqq"
printtables()
print( 't["ff"]="rrr"' ); t["ff"]="rrr"
printtables()
print( 't["dd"]="sss"' ); t["dd"]="sss"
printtables()
print( 'mt["gg"]="ttt"' ); mt["gg"]="ttt"
printtables()
-- select
print( 'pcall(select)', pcall(select) )
print( 'select(1,11,22,33,44,55)', select(1,11,22,33,44,55) )
print( 'select(2,11,22,33,44,55)', select(2,11,22,33,44,55) )
print( 'select(3,11,22,33,44,55)', select(3,11,22,33,44,55) )
print( 'select(4,11,22,33,44,55)', select(4,11,22,33,44,55) )
print( 'pcall(select,5,11,22,33,44,55)', pcall(select,5,11,22,33,44,55) )
print( 'pcall(select,6,11,22,33,44,55)', pcall(select,6,11,22,33,44,55) )
print( 'pcall(select,7,11,22,33,44,55)', pcall(select,7,11,22,33,44,55) )
print( 'pcall(select,0,11,22,33,44,55)', pcall(select,0,11,22,33,44,55) )
print( 'pcall(select,-1,11,22,33,44,55)', pcall(select,-1,11,22,33,44,55) )
print( 'pcall(select,-2,11,22,33,44,55)', pcall(select,-2,11,22,33,44,55) )
print( 'pcall(select,-4,11,22,33,44,55)', pcall(select,-4,11,22,33,44,55) )
print( 'pcall(select,-5,11,22,33,44,55)', pcall(select,-5,11,22,33,44,55) )
print( 'pcall(select,-6,11,22,33,44,55)', pcall(select,-6,11,22,33,44,55) )
print( 'pcall(select,1)', pcall(select,1) )
print( 'pcall(select,select)', pcall(select,select) )
print( 'pcall(select,{})', pcall(select,{}) )
print( 'pcall(select,"2",11,22,33)', pcall(select,"2",11,22,33) )
print( 'pcall(select,"abc",11,22,33)', pcall(select,"abc",11,22,33) )
-- tonumber
print( 'pcall(tonumber)', pcall(tostring) )
print( 'pcall(tonumber,nil)', pcall(tonumber,nil) )
print( 'pcall(tonumber,"abc")', pcall(tonumber,"abc") )
print( 'pcall(tonumber,"123")', pcall(tonumber,"123") )
print( 'pcall(tonumber,"123",10)', pcall(tonumber,"123", 10) )
print( 'pcall(tonumber,"123",8)', pcall(tonumber,"123", 8) )
print( 'pcall(tonumber,"123",6)', pcall(tonumber,"123", 6) )
print( 'pcall(tonumber,"10101",4)', pcall(tonumber,"10101", 4) )
print( 'pcall(tonumber,"10101",3)', pcall(tonumber,"10101", 3) )
print( 'pcall(tonumber,"10101",2)', pcall(tonumber,"10101", 2) )
print( 'pcall(tonumber,"1a1",16)', pcall(tonumber,"1a1", 16) )
print( 'pcall(tonumber,"1a1",32)', pcall(tonumber,"1a1", 32) )
print( 'pcall(tonumber,"1a1",54)', pcall(tonumber,"1a1", 54) )
print( 'pcall(tonumber,"1a1",1)', pcall(tonumber,"1a1", 1) )
print( 'pcall(tonumber,"1a1",0)', pcall(tonumber,"1a1", 0) )
print( 'pcall(tonumber,"1a1",-1)', pcall(tonumber,"1a1", -1) )
print( 'pcall(tonumber,"1a1","32")', pcall(tonumber,"1a1", "32") )
print( 'pcall(tonumber,"123","456")', pcall(tonumber,"123","456") )
print( 'pcall(tonumber,"1a1",10)', pcall(tonumber,"1a1", 10) )
print( 'pcall(tonumber,"151",4)', pcall(tonumber,"151", 4) )
print( 'pcall(tonumber,"151",3)', pcall(tonumber,"151", 3) )
print( 'pcall(tonumber,"151",2)', pcall(tonumber,"151", 2) )
print( 'pcall(tonumber,"123",8,8)', pcall(tonumber,"123", 8, 8) )
print( 'pcall(tonumber,123)', pcall(tonumber,123) )
print( 'pcall(tonumber,true)', pcall(tonumber,true) )
print( 'pcall(tonumber,false)', pcall(tonumber,false) )
print( 'pcall(tonumber,tonumber)', pcall(tonumber,tonumber) )
print( 'pcall(tonumber,function() end)', pcall(tonumber,function() end) )
print( 'pcall(tonumber,{"one","two",a="aa",b="bb"})', pcall(tonumber,{"one","two",a="aa",b="bb"}) )
print( 'pcall(tonumber,"123.456")', pcall(tonumber,"123.456") )
print( 'pcall(tonumber," 123.456")', pcall(tonumber," 123.456") )
print( 'pcall(tonumber," 234qwer")', pcall(tonumber," 234qwer") )
print( 'pcall(tonumber,"0x20")', pcall(tonumber,"0x20") )
print( 'pcall(tonumber," 0x20")', pcall(tonumber," 0x20") )
print( 'pcall(tonumber,"0x20 ")', pcall(tonumber,"0x20 ") )
print( 'pcall(tonumber," 0x20 ")', pcall(tonumber," 0x20 ") )
print( 'pcall(tonumber,"0X20")', pcall(tonumber,"0X20") )
print( 'pcall(tonumber," 0X20")', pcall(tonumber," 0X20") )
print( 'pcall(tonumber,"0X20 ")', pcall(tonumber,"0X20 ") )
print( 'pcall(tonumber," 0X20 ")', pcall(tonumber," 0X20 ") )
print( 'pcall(tonumber,"0x20",10)', pcall(tonumber,"0x20",10) )
print( 'pcall(tonumber,"0x20",16)', pcall(tonumber,"0x20",16) )
print( 'pcall(tonumber,"0x20",8)', pcall(tonumber,"0x20",8) )
-- tostring
print( 'pcall(tostring)', pcall(tostring) )
print( 'pcall(tostring,nil)', pcall(tostring,nil) )
print( 'pcall(tostring,"abc")', pcall(tostring,"abc") )
print( 'pcall(tostring,"abc","def")', pcall(tostring,"abc","def") )
print( 'pcall(tostring,123)', pcall(tostring,123) )
print( 'pcall(tostring,true)', pcall(tostring,true) )
print( 'pcall(tostring,false)', pcall(tostring,false) )
print( 'tostring(tostring)', type(tostring(tostring)) )
print( 'tostring(function() end)', type(tostring(function() end)) )
print( 'tostring({"one","two",a="aa",b="bb"})', type(tostring({"one","two",a="aa",b="bb"})) )
-- _VERSION
print( '_VERSION', type(_VERSION) )
-- xpcall
local errfunc = function( detail )
print( ' in errfunc', type(detail) )
return 'response-from-xpcall'
end
local badfunc = function() error( 'error-from-badfunc' ) end
local wrappedbad = function() pcall( badfunc ) end
print( 'pcall(badfunc)', pcall(badfunc) )
print( 'pcall(badfunc,errfunc)', pcall(badfunc,errfunc) )
print( 'pcall(badfunc,badfunc)', pcall(badfunc,badfunc) )
print( 'pcall(wrappedbad)', pcall(wrappedbad) )
print( 'pcall(wrappedbad,errfunc)', pcall(wrappedbad,errfunc) )
print( 'pcall(xpcall(badfunc))', pcall(xpcall,badfunc) )
print( 'pcall(xpcall(badfunc,errfunc))', pcall(xpcall,badfunc,errfunc) )
print( 'pcall(xpcall(badfunc,badfunc))', pcall(xpcall,badfunc,badfunc) )
print( 'pcall(xpcall(wrappedbad))', pcall(xpcall,wrappedbad) )
print( 'xpcall(wrappedbad,errfunc)', xpcall(wrappedbad,errfunc) )

View File

@@ -0,0 +1,126 @@
function printrunning()
if coroutine.running() == nil then
print("running is nil");
else
print("running is not nil")
end
end
function foo (a)
print("foo", a)
return coroutine.yield(2*a)
end
co = coroutine.create(function (a,b)
print("co-body", a, b)
local r = foo(a+1)
print("co-body", r)
local r, s = coroutine.yield(a+b, a-b)
print("co-body", r, s)
printrunning()
print("co.status.inside",coroutine.status(co));
local co2 = coroutine.create(function()
print("co.status.inside2",coroutine.status(co));
end)
print("co.status.inside",coroutine.status(co));
coroutine.resume(co2);
return b, "end"
end)
function exercise()
printrunning()
print("co.status",coroutine.status(co));
print("main", coroutine.resume(co, 1, 10))
print("co.status",coroutine.status(co));
print("main", coroutine.resume(co, "r"))
print("co.status",coroutine.status(co));
print("main", coroutine.resume(co, "x", "y"))
print("co.status",coroutine.status(co));
print("main", coroutine.resume(co, "x", "y"))
print("co.status",coroutine.status(co));
end
exercise();
co = coroutine.create(function (a,b)
print("co-body", a, b)
-- TODO: make java and C behave the same for yielding in pcalls
-- local status,r = pcall( foo, a+1 )
foo(a+1)
print("co-body", status,r)
local r, s = coroutine.yield(a+b, a-b)
print("co-body", r, s)
return b, "end"
end)
exercise();
-- wrap test
local g = coroutine.wrap(function (a,b)
print("co-body", a, b)
local r = foo(a+1)
print("co-body", r)
local r, s = coroutine.yield(a+b, a-b)
print("co-body", r, s)
return b, "end"
end )
print("g", g(1, 10))
print("g", g("r"))
print("g", g("x", "y"))
local s,e = pcall( g, "x", "y" )
print("g", string.match(e,'cannot resume dead coroutine') or 'badmessage: '..tostring(e))
-- varargs passing
local echo = function(msg,...)
print( msg, ...)
return ...
end
local echocr = function(...)
local arg = table.pack(...)
echo('(echocr) first args', table.unpack(arg,1,arg.n))
local a = arg
while true do
a = { echo( '(echoch) yield returns', coroutine.yield( table.unpack(a) ) ) }
end
end
local c = coroutine.create( echocr )
local step = function(...)
echo( '(main) resume returns',
coroutine.resume(c, echo('(main) sending args', ...)) )
end
step(111,222,333)
step()
step(111)
step(111,222,333)
-- test loops in resume calls
b = coroutine.create( function( arg )
while ( true ) do
print( ' b-resumed', arg, b == coroutine.running() )
print( ' b-b', coroutine.status(b) )
print( ' b-c', coroutine.status(c) )
print( ' b-resume-b',coroutine.resume( b, 'b-arg-for-b' ) )
print( ' b-resume-c',coroutine.resume( c, 'b-arg-for-c' ) )
arg = coroutine.yield( 'b-rslt' )
end
end )
c = coroutine.create( function( arg )
for i=1,3 do
print( ' c-resumed', arg, c == coroutine.running() )
print( ' c-b', coroutine.status(b) )
print( ' c-c', coroutine.status(c) )
print( ' c-resume-b',coroutine.resume( b, 'b-arg-for-b' ) )
print( ' c-resume-c',coroutine.resume( c, 'b-arg-for-c' ) )
arg = coroutine.yield( 'c-rslt' )
end
end )
for i=1,3 do
print( 'main-b', coroutine.status(b) )
print( 'main-c', coroutine.status(c) )
print( 'main-resume-b',coroutine.resume( b, 'main-arg-for-b' ) )
print( 'main-resume-c',coroutine.resume( c, 'main-arg-for-c' ) )
end

View File

@@ -0,0 +1,280 @@
local print,tostring,_G,pcall,ipairs,isnumber = print,tostring,_G,pcall,ipairs,isnumber
local e,f,g,h,s
print( 'has debug', debug~=nil )
if not debug then error( 'no debug' ) end
print( '----- debug.getlocal, debug.setlocal' )
h = function(v,i,n)
s = 'h-'..v..'-'..i
local x1,y1 = debug.getlocal(v,i)
local x2,y2 = debug.setlocal(v,i,n)
local x3,y3 = debug.getlocal(v,i)
return s..' -> '..v..'-'..i..' '..
'get='..tostring(x1)..','..tostring(y1)..' '..
'set='..tostring(x2)..','..tostring(y2)..' '..
'get='..tostring(x3)..','..tostring(y3)..' '
end
g = function(...)
local p,q,r=7,8,9
local t = h(...)
local b = table.concat({...},',')
return t..'\tg locals='..p..','..q..','..r..' tbl={'..b..'}'
end
f = function(a,b,c)
local d,e,f = 4,5,6
local t = g(a,b,c)
return t..'\tf locals='..','..a..','..b..','..c..','..d..','..e..','..f
end
for lvl=3,2,-1 do
for lcl=0,7 do
print( pcall( f, lvl, lcl, '#' ) )
end
end
for lvl=1,1 do
for lcl=3,7 do
print( pcall( f, lvl, lcl, '#' ) )
end
end
print( '----- debug.getupvalue, debug.setupvalue' )
local m,n,o = 101,102,103
f = function(p,q,r)
local p,q,r = 104,105,106
local g = function(s,t,u)
local v,w,x = 107,108,109
return function()
return m,n,o,p,q,r,v,w,x
end
end
return g
end
g = f()
h = g()
local callh = function()
local t = {}
for i,v in ipairs( { pcall(h) } ) do
t[i] = tostring(v)
end
return table.concat(t,',')
end
print( 'h', h() )
local funs = { f, g, h }
local names = { 'f', 'g', 'h' }
for i=1,3 do
local fun,name = funs[i],names[i]
for index=0,10 do
local s1,x1,y1 = pcall( debug.getupvalue, fun, index )
local s2,x2,y2 = pcall( debug.setupvalue, fun, index, 666000+i*111000+index )
local s3,x3,y3 = pcall( debug.getupvalue, fun, index )
print( name..' -> '..i..'-'..index..' '..
'get='..tostring(s1)..','..tostring(x1)..','..tostring(y1)..' '..
'set='..tostring(s2)..','..tostring(x2)..','..tostring(y2)..' '..
'get='..tostring(s3)..','..tostring(x3)..','..tostring(y3)..' '..
'tbl='..callh() )
end
end
print( '----- debug.setmetatable, debug.getmetatable' )
local a = {a='bbb'}
local b = {}
local mt = {__index={b='ccc'}}
print( 'a.a='..tostring(a.a)..' a.b='..tostring(a.b)..' b.a='..tostring(b.a)..' b.b='..tostring(b.b))
local s1,x1,y1 = pcall( debug.getmetatable, a )
local s2,x2,y2 = pcall( debug.setmetatable, a, mt )
print( 'a.a='..tostring(a.a)..' a.b='..tostring(a.b)..' b.a='..tostring(b.a)..' b.b='..tostring(b.b))
local s3,x3,y3 = pcall( debug.getmetatable, a ) print(type(s3), type(x3), type(y3), type(getmetatable(a)))
local s4,x4,y4 = pcall( debug.getmetatable, b ) print(type(s4), type(x4), type(y4), type(getmetatable(b)))
local s5,x5,y5 = pcall( debug.setmetatable, a, nil ) print(type(s5), type(x5), type(y5), type(getmetatable(a)))
print( 'a.a='..tostring(a.a)..' a.b='..tostring(a.b)..' b.a='..tostring(b.a)..' b.b='..tostring(b.b))
local s6,x6,y6 = pcall( debug.getmetatable, a ) print(type(s6), type(x6), type(y6), type(getmetatable(a)))
if not s1 then print( 's1 error', x1 ) end
if not s2 then print( 's2 error', x2 ) end
if not s3 then print( 's3 error', x3 ) end
if not s4 then print( 's4 error', x4 ) end
if not s5 then print( 's5 error', x5 ) end
if not s6 then print( 's6 error', x6 ) end
print( 'get='..tostring(s1)..','..tostring(x1==nil)..','..tostring(y1) )
print( 'set='..tostring(s2)..','..tostring(x2==a)..','..tostring(y2) )
print( 'get='..tostring(s3)..','..tostring(x3==mt)..','..tostring(y3) )
print( 'get='..tostring(s4)..','..tostring(x4==nil)..','..tostring(y4) )
print( 'set='..tostring(s5)..','..tostring(x5==a)..','..tostring(y5) )
print( 'get='..tostring(s6)..','..tostring(x6==nil)..','..tostring(y6) )
print( pcall( debug.getmetatable, 1 ) )
print( pcall( debug.setmetatable, 1, {} ) )
print( pcall( debug.setmetatable, 1, nil ) )
print( '----- debug.getinfo' )
local printfield = function(tbl, field)
local x = tbl[field]
if x == nil then return end
local typ = type(x)
if typ=='table' then
x = '{'..table.concat(x,',')..'}'
elseif typ=='function' then
x = typ
end
print( ' '..field..': '..tostring(x) )
end
local fields = { 'source', 'short_src', 'what',
'currentline', 'linedefined', 'lastlinedefined',
'nups', 'func', 'activelines' }
local printinfo = function(...)
for i,a in ipairs({...}) do
if type(a) == 'table' then
for j,field in ipairs(fields) do
printfield( a, field)
end
else
print( tostring(a) )
end
end
end
function test()
local x = 5
function f()
x = x + 1
return x
end
function g()
x = x - 1
print( '---' )
printinfo( 'debug.getinfo(1)', debug.getinfo(1) )
printinfo( 'debug.getinfo(1,"")', debug.getinfo(1, "") )
printinfo( 'debug.getinfo(1,"l")', debug.getinfo(1, "l") )
printinfo( 'debug.getinfo(1,"fL")', debug.getinfo(1, "fL") )
printinfo( 'debug.getinfo(2)', debug.getinfo(2) )
printinfo( 'debug.getinfo(2,"l")', debug.getinfo(2, "l") )
printinfo( 'debug.getinfo(2,"fL")', debug.getinfo(2, "fL") )
printinfo( 'debug.getinfo(10,"")', pcall( debug.getinfo, 10, "" ) )
printinfo( 'debug.getinfo(-10,"")', pcall( debug.getinfo, -10, "" ) )
print( '---' )
return x
end
print(f())
print(g())
return f, g
end
local options = "nSlufL"
local e,f,g = pcall( test )
print( 'e,f,g', e, type(f), type(g) )
printinfo( 'debug.getinfo(f)', pcall(debug.getinfo, f) )
printinfo( 'debug.getinfo(f,"'..options..'")', pcall(debug.getinfo, f, options) )
for j=1,6 do
local opts = options:sub(j,j)
printinfo( 'debug.getinfo(f,"'..opts..'")', pcall(debug.getinfo, f, opts) )
end
printinfo( 'debug.getinfo(g)', pcall(debug.getinfo, g) )
printinfo( 'debug.getinfo(test)', pcall(debug.getinfo, test) )
print( '----- debug.sethook, debug.gethook' )
f = function(x)
g = function(y)
return math.min(x,h)
end
local a = g(x)
return a + a
end
local hook = function(...)
print( ' ... in hook', ... )
local info = debug.getinfo(2,"Sl")
if info then
print( ' info[2]='..tostring(info.short_src)..','..tostring(info.currentline) )
end
end
local tryfunc = function(hook,mask,func,arg)
local x,f,h,m
pcall( function()
debug.sethook(hook,mask)
x = func(arg)
f,h,m = debug.gethook()
end )
debug.sethook()
return x,f,h,m
end
local tryhooks = function(mask)
local s1,a1,b1,c1,d1 = pcall( tryfunc, hook, mask, f, 333 )
print( 'hook = '..mask..' -> '..
'result='..tostring(s1)..','..tostring(a1)..','..
type(b1)..','..type(c1)..','..
tostring(b1==f)..','..tostring(c1==hook)..','..
tostring(d1)..' ' )
end
tryhooks("c")
tryhooks("r")
tryhooks("l")
tryhooks("crl")
print( '----- debug.traceback' )
function test()
function a(msg)
print((string.gsub(debug.traceback(msg), "%[Java]", "[C]")))
end
local function b(msg)
pcall(a,msg)
end
c = function(i)
if i <= 0 then b('hi') return end
return c(i-1)
end
d = setmetatable({},{__index=function(t,k) v = c(k) return v end})
local e = function()
return d[0]
end
local f = {
g = function()
e()
end
}
h = function()
f.g()
end
local i = h
i()
end
pcall(test)
print( '----- debug.upvalueid' )
local x,y = 100,200
function a(b,c)
local z,w = b,c
return function()
x,y,z,w = x+1,y+1,z+1,w+1
return x,y,z,w
end
end
a1 = a(300,400)
a2 = a(500,600)
print('debug.getupvalue(a1,1)', debug.getupvalue(a1,1))
print('debug.getupvalue(a1,2)', debug.getupvalue(a1,2))
print('debug.getupvalue(a2,1)', debug.getupvalue(a2,1))
print('debug.getupvalue(a2,2)', debug.getupvalue(a2,2))
print('debug.upvalueid(a1,1) == debug.upvalueid(a1,1)', debug.upvalueid(a1,1) == debug.upvalueid(a1,1))
print('debug.upvalueid(a1,1) == debug.upvalueid(a2,1)', debug.upvalueid(a1,1) == debug.upvalueid(a2,1))
print('debug.upvalueid(a1,1) == debug.upvalueid(a1,2)', debug.upvalueid(a1,1) == debug.upvalueid(a1,2))
print( '----- debug.upvaluejoin' )
print('a1',a1())
print('a2',a2())
print('debug.upvaluejoin(a1,1,a2,2)', debug.upvaluejoin(a1,1,a2,2))
print('debug.upvaluejoin(a1,3,a2,4)', debug.upvaluejoin(a1,3,a2,4))
print('a1',a1())
print('a2',a2())
print('a1',a1())
print('a2',a2())
for i = 1,4 do
print('debug.getupvalue(a1,'..i..')', debug.getupvalue(a1,i))
print('debug.getupvalue(a2,'..i..')', debug.getupvalue(a2,i))
for j = 1,4 do
print('debug.upvalueid(a1,'..i..') == debug.upvalueid(a1,'..j..')', debug.upvalueid(a1,i) == debug.upvalueid(a1,j))
print('debug.upvalueid(a1,'..i..') == debug.upvalueid(a2,'..j..')', debug.upvalueid(a1,i) == debug.upvalueid(a2,j))
print('debug.upvalueid(a2,'..i..') == debug.upvalueid(a1,'..j..')', debug.upvalueid(a2,i) == debug.upvalueid(a1,j))
print('debug.upvalueid(a2,'..i..') == debug.upvalueid(a2,'..j..')', debug.upvalueid(a2,i) == debug.upvalueid(a2,j))
end
end

View File

@@ -0,0 +1,137 @@
-- tostring replacement that assigns ids
local ts,id,nid,types = tostring,{},0,{table='tbl',thread='thr',userdata='uda',['function']='func'}
tostring = function(x)
if not x or not types[type(x)] then return ts(x) end
if not id[x] then nid=nid+1; id[x]=types[type(x)]..'.'..nid end
return id[x]
end
-- test of common types of errors
-- local function c(f,...) return f(...) end
-- local function b(...) return c(...) end
--local function a(...) return (pcall(b,...)) end
local function a(...) local s,e=pcall(...) if s then return s,e else return false,type(e) end end
s = 'some string'
local t = {}
-- error message tests
print( 'a(error)', a(error) )
print( 'a(error,"msg")', a(error,"msg") )
print( 'a(error,"msg",0)', a(error,"msg",0) )
print( 'a(error,"msg",1)', a(error,"msg",1) )
print( 'a(error,"msg",2)', a(error,"msg",2) )
print( 'a(error,"msg",3)', a(error,"msg",3) )
print( 'a(error,"msg",4)', a(error,"msg",4) )
print( 'a(error,"msg",5)', a(error,"msg",5) )
print( 'a(error,"msg",6)', a(error,"msg",6) )
-- call errors
print( 'a(nil())', a(function() return n() end) )
print( 'a(t()) ', a(function() return t() end) )
print( 'a(s()) ', a(function() return s() end) )
print( 'a(true())', a(function() local b = true; return b() end) )
-- arithmetic errors
print( 'a(nil+1)', a(function() return nil+1 end) )
print( 'a(a+1) ', a(function() return a+1 end) )
print( 'a(s+1) ', a(function() return s+1 end) )
print( 'a(true+1)', a(function() local b = true; return b+1 end) )
-- table errors
print( 'a(nil.x)', a(function() return n.x end) )
print( 'a(a.x) ', a(function() return a.x end) )
print( 'a(s.x) ', a(function() return s.x end) )
print( 'a(true.x)', a(function() local b = true; return b.x end) )
print( 'a(nil.x=5)', a(function() n.x=5 end) )
print( 'a(a.x=5) ', a(function() a.x=5 end) )
print( 'a(s.x=5) ', a(function() s.x=5 end) )
print( 'a(true.x=5)', a(function() local b = true; b.x=5 end) )
-- len operator
print( 'a(#nil) ', a(function() return #n end) )
print( 'a(#t) ', a(function() return #t end) )
print( 'a(#s) ', a(function() return #s end) )
print( 'a(#a) ', a(function() return #a end) )
print( 'a(#true)', a(function() local b = true; return #b end) )
-- comparison errors
print( 'a(nil>1)', a(function() return nil>1 end) )
print( 'a(a>1) ', a(function() return a>1 end) )
print( 'a(s>1) ', a(function() return s>1 end) )
print( 'a(true>1)', a(function() local b = true; return b>1 end) )
-- unary minus errors
print( 'a(-nil)', a(function() return -n end) )
print( 'a(-a) ', a(function() return -a end) )
print( 'a(-s) ', a(function() return -s end) )
print( 'a(-true)', a(function() local b = true; return -b end) )
-- string concatenation
local function concatsuite(comparefunc)
print( '"a".."b"', comparefunc("a","b") )
print( '"a"..nil', comparefunc("a",nil) )
print( 'nil.."b"', comparefunc(nil,"b") )
print( '"a"..{}', comparefunc("a",{}) )
print( '{}.."b"', comparefunc({},"b") )
print( '"a"..2', comparefunc("a",2) )
print( '2.."b"', comparefunc(2,"b") )
print( '"a"..print', comparefunc("a",print) )
print( 'print.."b"', comparefunc(print,"b") )
print( '"a"..true', comparefunc("a",true) )
print( 'true.."b"', comparefunc(true,"b") )
print( 'nil..true', comparefunc(nil,true) )
print( '"a"..3.5', comparefunc("a",3.5) )
print( '3.5.."b"', comparefunc(3.5,"b") )
end
local function strconcat(a,b)
return (pcall( function() return a..b end) )
end
local function tblconcat(a,b)
local t={a,b}
return (pcall( function() return table.concat(t,'-',1,2) end ))
end
print( '-------- string concatenation' )
concatsuite(strconcat)
print( '-------- table concatenation' )
concatsuite(tblconcat)
-- pairs
print( '-------- pairs tests' )
print( 'a(pairs(nil))', a(function() return pairs(nil,{}) end) )
print( 'a(pairs(a)) ', a(function() return pairs(a,{}) end) )
print( 'a(pairs(s)) ', a(function() return pairs(s,{}) end) )
print( 'a(pairs(t)) ', a(function() return pairs(t,{}) end) )
print( 'a(pairs(true))', a(function() local b = true; return pairs(b,{}) end) )
-- setmetatable
print( '-------- setmetatable tests' )
function sm(...)
return tostring(setmetatable(...))
end
print( 'a(setmetatable(nil))', a(function() return sm(nil,{}) end) )
print( 'a(setmetatable(a)) ', a(function() return sm(a,{}) end) )
print( 'a(setmetatable(s)) ', a(function() return sm(s,{}) end) )
print( 'a(setmetatable(true))', a(function() local b = true; return sm(b,{}) end) )
print( 'a(setmetatable(t)) ', a(function() return sm(t,{}) end) )
print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) )
print( 'a(setmetatable(t*)) ', a(function() return sm(t,{__metatable={}}) end) )
print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) )
print( 'a(setmetatable(t)) ', a(function() return sm(t,{}) end) )
print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) )
t = {}
print( 'a(setmetatable(t)) ', a(function() return sm(t,{}) end) )
print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) )
print( 'a(setmetatable(t*)) ', a(function() return sm(t,{__metatable='some string'}) end) )
print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) )
print( 'a(setmetatable(t)) ', a(function() return sm(t,{}) end) )
print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) )
print( 'a(setmetatable(t,nil)) ', a(function() return sm(t,nil) end) )
print( 'a(setmetatable(t)) ', a(function() return sm(t) end) )
print( 'a(setmetatable({},"abc")) ', a(function() return sm({},'abc') end) )
-- bad args to error!
print( 'error("msg","arg")', a(function() error('some message', 'some bad arg') end) )
-- loadfile, dofile on missing files
print( 'loadfile("bogus.txt")', a(function() return loadfile("bogus.txt") end) )
print( 'dofile("bogus.txt")', a(function() return dofile("bogus.txt") end) )

Some files were not shown because too many files have changed in this diff Show More