| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- -- testing debug library
- local a = 1
- local function multi_assert(expected, ...)
- local arg = { ... }
- for i = 1, #arg do
- assert(arg[i] == expected[i])
- end
- end
- local function test_locals(x, ...)
- local b = "local b"
- assert(debug.getlocal(test_locals, 1) == "x")
- multi_assert({ "x", 1 }, debug.getlocal(1, 1))
- multi_assert({ "b", "local b" }, debug.getlocal(1, 2))
- multi_assert({ "(vararg)", 2 }, debug.getlocal(1, -1))
- multi_assert({ "(vararg)", 3 }, debug.getlocal(1, -2))
- multi_assert({ "a", 1 }, debug.getlocal(2, 1))
- assert(debug.setlocal(2, 1, "new a") == "a")
- end
- test_locals(1, 2, 3)
- assert(a == "new a")
- -- 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!
- if not name then
- name = 'f'
- end
- local a = debug.getinfo(1)
- print(a.name, a.namewhat, name)
- 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
- local function test_upvalues()
- local a = 3
- local function f(x)
- local b = a + x
- local function g(y)
- local c = b + y
- local function h()
- return a + b + c
- end
- multi_assert({ "a", 3 }, debug.getupvalue(h, 1))
- multi_assert({ "b", 4 }, debug.getupvalue(h, 2))
- multi_assert({ "c", 6 }, debug.getupvalue(h, 3))
- multi_assert({ "b", 4 }, debug.getupvalue(g, 1))
- multi_assert({ "a", 3 }, debug.getupvalue(g, 2))
- multi_assert({ "a", 3 }, debug.getupvalue(f, 1))
- debug.setupvalue(h, 1, 10)
- debug.setupvalue(h, 2, 20)
- debug.setupvalue(h, 3, 30)
- assert(h() == 60)
- end
- g(2)
- end
- f(1)
- end
- test_upvalues()
- local mt = {
- __metatable = "my own metatable",
- __index = function(o, k)
- return o + k
- end
- }
- local a = 1
- local b = 2
- local function f()
- return a
- end
- local function g()
- return b
- end
- debug.upvaluejoin(f, 1, g, 1)
- assert(f() == 2)
- b = 3
- assert(f() == 3)
- debug.setmetatable(10, mt)
- assert(debug.getmetatable(10) == mt)
- a = 10
- assert(a[3] == 13)
- assert(debug.traceback(print) == print)
- assert(debug.traceback(print) == print)
- assert(type(debug.getregistry()) == "table")
- -- 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_mini.lua", "db_mini.lua", "db_mini.lua", "db_mini.lua" })
- checktraceback(co, { "db_mini.lua", "db_mini.lua", "db_mini.lua", "db_mini.lua" }, 1)
- checktraceback(co, { "db_mini.lua", "db_mini.lua", "db_mini.lua" }, 2)
- checktraceback(co, { "db_mini.lua" }, 4)
- checktraceback(co, {}, 40)
|