diff options
Diffstat (limited to '')
| -rwxr-xr-x | lib/compat53/tests/test-bit32.lua | 10 | ||||
| -rwxr-xr-x | lib/compat53/tests/test.lua | 866 | ||||
| -rw-r--r-- | lib/compat53/tests/testmod.c | 370 |
3 files changed, 0 insertions, 1246 deletions
diff --git a/lib/compat53/tests/test-bit32.lua b/lib/compat53/tests/test-bit32.lua deleted file mode 100755 index a408b7d..0000000 --- a/lib/compat53/tests/test-bit32.lua +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env lua - -local bit32 = require("bit32") - - -assert(bit32.bnot(0) == 2^32-1) -assert(bit32.bnot(-1) == 0) -assert(bit32.band(1, 3, 5) == 1) -assert(bit32.bor(1, 3, 5) == 7) - diff --git a/lib/compat53/tests/test.lua b/lib/compat53/tests/test.lua deleted file mode 100755 index 503e3f4..0000000 --- a/lib/compat53/tests/test.lua +++ /dev/null @@ -1,866 +0,0 @@ -#!/usr/bin/env lua - -local F, tproxy, writefile, noprint, ___ -do - local type, unpack = type, table.unpack or unpack - local assert, io = assert, io - function F(...) - local args, n = { ... }, select('#', ...) - for i = 1, n do - local t = type(args[i]) - if t ~= "string" and t ~= "number" and t ~= "boolean" then - args[i] = t - end - end - return unpack(args, 1, n) - end - function tproxy(t) - return setmetatable({}, { - __index = t, - __newindex = t, - __len = function() return #t end, - }), t - end - function writefile(name, contents, bin) - local f = assert(io.open(name, bin and "wb" or "w")) - f:write(contents) - f:close() - end - function noprint() end - local sep = ("="):rep(70) - function ___() - print(sep) - end -end - -local V = _VERSION:gsub("^.*(%d+)%.(%d+)$", "%1%2") -if jit then V = "jit" end - -local is_puclua51 = (_VERSION == "Lua 5.1" and not jit) - -local mode = "global" -if arg[1] == "module" then - mode = "module" -end -local self = arg[0] - -package.path = "../?.lua;../?/init.lua" -package.cpath = "./?-"..V..".so;./?-"..V..".dll;./?.so;./?.dll" -if mode == "module" then - print("testing Lua API using `compat53.module` ...") - _ENV = require("compat53.module") - if setfenv then setfenv(1, _ENV) end -else - print("testing Lua API using `compat53` ...") - require("compat53") -end - - -___'' -do - print("assert", F(pcall(assert, false))) - print("assert", F(pcall(assert, false, nil))) - print("assert", F(pcall(assert, false, "error msg"))) - print("assert", F(pcall(assert, nil, {}))) - print("assert", F(pcall(assert, 1, 2, 3))) -end - - -___'' -do - local t = setmetatable({}, { __index = { 1, false, "three" } }) - for i,v in ipairs(t) do - print("ipairs", i, v) - end -end - - -___'' -do - local p, t = tproxy{ "a", "b", "c" } - print("table.concat", table.concat(p)) - print("table.concat", table.concat(p, ",", 2)) - print("table.concat", table.concat(p, ".", 1, 2)) - print("table.concat", table.concat(t)) - print("table.concat", table.concat(t, ",", 2)) - print("table.concat", table.concat(t, ".", 1, 2)) -end - - -___'' -do - local p, t = tproxy{ "a", "b", "c" } - table.insert(p, "d") - print("table.insert", next(p), t[4]) - table.insert(p, 1, "z") - print("table.insert", next(p), t[1], t[2]) - table.insert(p, 2, "y") - print("table.insert", next(p), t[1], t[2], p[3]) - t = { "a", "b", "c" } - table.insert(t, "d") - print("table.insert", t[1], t[2], t[3], t[4]) - table.insert(t, 1, "z") - print("table.insert", t[1], t[2], t[3], t[4], t[5]) - table.insert(t, 2, "y") - print("table.insert", t[1], t[2], t[3], t[4], t[5]) -end - - -___'' -do - local ps, s = tproxy{ "a", "b", "c", "d" } - local pd, d = tproxy{ "A", "B", "C", "D" } - table.move(ps, 1, 4, 1, pd) - print("table.move", next(pd), d[1], d[2], d[3], d[4]) - pd, d = tproxy{ "A", "B", "C", "D" } - table.move(ps, 2, 4, 1, pd) - print("table.move", next(pd), d[1], d[2], d[3], d[4]) - pd, d = tproxy{ "A", "B", "C", "D" } - table.move(ps, 2, 3, 4, pd) - print("table.move", next(pd), d[1], d[2], d[3], d[4], d[5]) - table.move(ps, 2, 4, 1) - print("table.move", next(ps), s[1], s[2], s[3], s[4]) - ps, s = tproxy{ "a", "b", "c", "d" } - table.move(ps, 2, 3, 4) - print("table.move", next(ps), s[1], s[2], s[3], s[4], s[5]) - s = { "a", "b", "c", "d" } - d = { "A", "B", "C", "D" } - table.move(s, 1, 4, 1, d) - print("table.move", d[1], d[2], d[3], d[4]) - d = { "A", "B", "C", "D" } - table.move(s, 2, 4, 1, d) - print("table.move", d[1], d[2], d[3], d[4]) - d = { "A", "B", "C", "D" } - table.move(s, 2, 3, 4, d) - print("table.move", d[1], d[2], d[3], d[4], d[5]) - table.move(s, 2, 4, 1) - print("table.move", s[1], s[2], s[3], s[4]) - s = { "a", "b", "c", "d" } - table.move(s, 2, 3, 4) - print("table.move", s[1], s[2], s[3], s[4], s[5]) -end - - -___'' -do - local p, t = tproxy{ "a", "b", "c", "d", "e" } - print("table.remove", table.remove(p)) - print("table.remove", next(p), t[1], t[2], t[3], t[4], t[5]) - print("table.remove", table.remove(p, 1)) - print("table.remove", next(p), t[1], t[2], t[3], t[4]) - print("table.remove", table.remove(p, 2)) - print("table.remove", next(p), t[1], t[2], t[3]) - print("table.remove", table.remove(p, 3)) - print("table.remove", next(p), t[1], t[2], t[3]) - p, t = tproxy{} - print("table.remove", table.remove(p)) - print("table.remove", next(p), next(t)) - t = { "a", "b", "c", "d", "e" } - print("table.remove", table.remove(t)) - print("table.remove", t[1], t[2], t[3], t[4], t[5]) - print("table.remove", table.remove(t, 1)) - print("table.remove", t[1], t[2], t[3], t[4]) - print("table.remove", table.remove(t, 2)) - print("table.remove", t[1], t[2], t[3]) - print("table.remove", table.remove(t, 3)) - print("table.remove", t[1], t[2], t[3]) - t = {} - print("table.remove", table.remove(t)) - print("table.remove", next(t)) -end - -___'' -do - local p, t = tproxy{ 3, 1, 5, 2, 8, 5, 2, 9, 7, 4 } - table.sort(p) - print("table.sort", next(p)) - for i,v in ipairs(t) do - print("table.sort", i, v) - end - table.sort(p) - print("table.sort", next(p)) - for i,v in ipairs(t) do - print("table.sort", i, v) - end - p, t = tproxy{ 9, 8, 7, 6, 5, 4, 3, 2, 1 } - table.sort(p) - print("table.sort", next(p)) - for i,v in ipairs(t) do - print("table.sort", i, v) - end - table.sort(p, function(a, b) return a > b end) - print("table.sort", next(p)) - for i,v in ipairs(t) do - print("table.sort", i, v) - end - p, t = tproxy{ 1, 1, 1, 1, 1 } - print("table.sort", next(p)) - for i,v in ipairs(t) do - print("table.sort", i, v) - end - t = { 3, 1, 5, 2, 8, 5, 2, 9, 7, 4 } - table.sort(t) - for i,v in ipairs(t) do - print("table.sort", i, v) - end - table.sort(t, function(a, b) return a > b end) - for i,v in ipairs(t) do - print("table.sort", i, v) - end -end - - -___'' -do - local p, t = tproxy{ "a", "b", "c" } - print("table.unpack", table.unpack(p)) - print("table.unpack", table.unpack(p, 2)) - print("table.unpack", table.unpack(p, 1, 2)) - print("table.unpack", table.unpack(t)) - print("table.unpack", table.unpack(t, 2)) - print("table.unpack", table.unpack(t, 1, 2)) -end - - -___'' -print("math.maxinteger", math.maxinteger+1 > math.maxinteger) -print("math.mininteger", math.mininteger-1 < math.mininteger) - - -___'' -print("math.tointeger", math.tointeger(0)) -print("math.tointeger", math.tointeger(math.pi)) -print("math.tointeger", math.tointeger("123")) -print("math.tointeger", math.tointeger("hello")) -print("math.tointeger", math.tointeger(math.maxinteger+2.0)) -print("math.tointeger", math.tointeger(math.mininteger*2.0)) - - -___'' -print("math.type", math.type(0)) -print("math.type", math.type(math.pi)) -print("math.type", math.type("hello")) - - -___'' -print("math.ult", math.ult(1, 2), math.ult(2, 1)) -print("math.ult", math.ult(-1, 2), math.ult(2, -1)) -print("math.ult", math.ult(-1, -2), math.ult(-2, -1)) -print("math.ult", pcall(math.ult, "x", 2)) -print("math.ult", pcall(math.ult, 1, 2.1)) -___'' - - -if utf8.len then - local unpack = table.unpack or unpack - local function utf8rt(s) - local t = { utf8.codepoint(s, 1, #s) } - local ps, cs = {}, {} - for p,c in utf8.codes(s) do - ps[#ps+1], cs[#cs+1] = p, c - end - print("utf8.codes", unpack(ps)) - print("utf8.codes", unpack(cs)) - print("utf8.codepoint", unpack(t)) - print("utf8.len", utf8.len(s), #t, #s) - print("utf8.char", utf8.char(unpack(t))) - end - utf8rt("äöüßÄÖÜ") - utf8rt("abcdefg") - ___'' - local s = "äöüßÄÖÜ" - print("utf8.offset", utf8.offset(s, 1, 1)) - print("utf8.offset", utf8.offset(s, 2, 1)) - print("utf8.offset", utf8.offset(s, 3, 1)) - print("utf8.offset", pcall(utf8.offset, s, 3, 2)) - print("utf8.offset", utf8.offset(s, 3, 3)) - print("utf8.offset", utf8.offset(s, -1, 7)) - print("utf8.offset", utf8.offset(s, -2, 7)) - print("utf8.offset", utf8.offset(s, -3, 7)) - print("utf8.offset", utf8.offset(s, -1)) - ___'' -else - print("XXX: utf8 module not available") -end - - -if string.pack then - local format = "bBhHlLjJdc3z" - local s = string.pack(format, -128, 255, -32768, 65535, -2147483648, 4294967295, -32768, 65536, 1.25, "abc", "defgh") - print("string.unpack", string.unpack(format, s)) - ___'' -else - print("XXX: string packing not available") -end - - -print("testing Lua API for Lua 5.1 ...") - -___'' -print("debug.getuservalue()", F(debug.getuservalue(false))) -print("debug.setuservalue()", pcall(function() - debug.setuservalue(false, {}) -end)) -print("debug.setmetatable()", F(debug.setmetatable({}, {}))) - - -___'' -do - local t = setmetatable({}, { - __pairs = function() return pairs({ a = "a" }) end, - }) - for k,v in pairs(t) do - print("pairs()", k, v) - end -end - - -___'' -do - local code = "print('hello world')\n" - local badcode = "print('blub\n" - print("load()", pcall(function() load(true) end)) - print("load()", F(load(badcode))) - print("load()", F(load(code))) - print("load()", F(load(code, "[L]"))) - print("load()", F(load(code, "[L]", "b"))) - print("load()", F(load(code, "[L]", "t"))) - print("load()", F(load(code, "[L]", "bt"))) - local f = load(code, "[L]", "bt", {}) - print("load()", pcall(f)) - f = load(code, "[L]", "bt", { print = noprint }) - print("load()", pcall(f)) - local bytecode = string.dump(f) - print("load()", F(load(bytecode))) - print("load()", F(load(bytecode, "[L]"))) - print("load()", F(load(bytecode, "[L]", "b"))) - print("load()", F(load(bytecode, "[L]", "t"))) - print("load()", F(load(bytecode, "[L]", "bt"))) - f = load(bytecode, "[L]", "bt", {}) - print("load()", pcall(f)) - f = load(bytecode, "[L]", "bt", { print = noprint }) - print("load()", pcall(f)) - local function make_loader(code) - local mid = math.floor( #code/2 ) - local array = { code:sub(1, mid), code:sub(mid+1) } - local i = 0 - return function() - i = i + 1 - return array[i] - end - end - print("load()", F(load(make_loader(badcode)))) - print("load()", F(load(make_loader(code)))) - print("load()", F(load(make_loader(code), "[L]"))) - print("load()", F(load(make_loader(code), "[L]", "b"))) - print("load()", F(load(make_loader(code), "[L]", "t"))) - print("load()", F(load(make_loader(code), "[L]", "bt"))) - f = load(make_loader(code), "[L]", "bt", {}) - print("load()", pcall(f)) - f = load(make_loader(code), "[L]", "bt", { print = noprint }) - print("load()", pcall(f)) - print("load()", F(load(make_loader(bytecode)))) - print("load()", F(load(make_loader(bytecode), "[L]"))) - print("load()", F(load(make_loader(bytecode), "[L]", "b"))) - print("load()", F(load(make_loader(bytecode), "[L]", "t"))) - print("load()", F(load(make_loader(bytecode), "[L]", "bt"))) - f = load(make_loader(bytecode), "[L]", "bt", {}) - print("load()", pcall(f)) - f = load(make_loader(bytecode), "[L]", "bt", { print = noprint }) - print("load()", pcall(f)) - writefile("good.lua", code) - writefile("bad.lua", badcode) - writefile("good.luac", bytecode, true) - print("loadfile()", F(loadfile("bad.lua"))) - print("loadfile()", F(loadfile("good.lua"))) - print("loadfile()", F(loadfile("good.lua", "b"))) - print("loadfile()", F(loadfile("good.lua", "t"))) - print("loadfile()", F(loadfile("good.lua", "bt"))) - f = loadfile("good.lua", "bt", {}) - print("loadfile()", pcall(f)) - f = loadfile("good.lua", "bt", { print = noprint }) - print("loadfile()", pcall(f)) - print("loadfile()", F(loadfile("good.luac"))) - print("loadfile()", F(loadfile("good.luac", "b"))) - print("loadfile()", F(loadfile("good.luac", "t"))) - print("loadfile()", F(loadfile("good.luac", "bt"))) - f = loadfile("good.luac", "bt", {}) - print("loadfile()", pcall(f)) - f = loadfile("good.luac", "bt", { print = noprint }) - print("loadfile()", pcall(f)) - os.remove("good.lua") - os.remove("bad.lua") - os.remove("good.luac") -end - - -___'' -do - local function func(throw) - if throw then - error("argh") - else - return 1, 2, 3 - end - end - local function tb(err) return "|"..err.."|" end - print("xpcall()", xpcall(func, debug.traceback, false)) - print("xpcall()", xpcall(func, debug.traceback, true)) - print("xpcall()", xpcall(func, tb, true)) - if mode ~= "module" then - local function func2(cb) - print("xpcall()", xpcall(cb, debug.traceback, "str")) - end - local function func3(cb) - print("pcall()", pcall(cb, "str")) - end - local function cb(arg) - coroutine.yield(2) - return arg - end - local c = coroutine.wrap(func2) - print("xpcall()", c(cb)) - print("xpcall()", c()) - local c = coroutine.wrap(func3) - print("pcall()", c(cb)) - print("pcall()", c()) - end -end - - -___'' -do - local t = setmetatable({ 1 }, { __len = function() return 5 end }) - print("rawlen()", rawlen(t), rawlen("123")) -end - - -___'' -print("os.execute()", os.execute("exit 1")) -io.flush() -print("os.execute()", os.execute("echo 'hello world!'")) -io.flush() -print("os.execute()", os.execute("no_such_file")) - - -___'' -do - local t = table.pack("a", nil, "b", nil) - print("table.(un)pack()", t.n, table.unpack(t, 1, t.n)) -end - - -___'' -do - print("coroutine.running()", F(coroutine.wrap(function() - return coroutine.running() - end)())) - print("coroutine.running()", F(coroutine.running())) - local main_co, co1, co2 = coroutine.running() - -- coroutine.yield - if mode ~= "module" then - print("coroutine.yield()", pcall(function() - coroutine.yield(1, 2, 3) - end)) - end - print("coroutine.yield()", coroutine.wrap(function() - coroutine.yield(1, 2, 3) - end)()) - print("coroutine.resume()", coroutine.resume(main_co, 1, 2, 3)) - co1 = coroutine.create(function(a, b, c) - print("coroutine.resume()", a, b, c) - return a, b, c - end) - print("coroutine.resume()", coroutine.resume(co1, 1, 2, 3)) - co1 = coroutine.create(function() - print("coroutine.status()", "[co1] main is", coroutine.status(main_co)) - print("coroutine.status()", "[co1] co2 is", coroutine.status(co2)) - end) - co2 = coroutine.create(function() - print("coroutine.status()", "[co2] main is", coroutine.status(main_co)) - print("coroutine.status()", "[co2] co2 is", coroutine.status(co2)) - coroutine.yield() - coroutine.resume(co1) - end) - print("coroutine.status()", coroutine.status(main_co)) - print("coroutine.status()", coroutine.status(co2)) - coroutine.resume(co2) - print("coroutine.status()", F(coroutine.status(co2))) - coroutine.resume(co2) - print("coroutine.status()", F(coroutine.status(co2))) -end - - -___'' -print("math.log()", math.log(1000)) -print("math.log()", math.log(1000, 10)) - - -___'' -do - local path, prefix = "./?.lua;?/init.lua;../?.lua", "package.searchpath()" - print(prefix, package.searchpath("no.such.module", path)) - print(prefix, package.searchpath("no.such.module", "")) - print(prefix, package.searchpath("compat53", path)) - print(prefix, package.searchpath("no:such:module", path, ":", "|")) -end - - -___'' -if mode ~= "module" then - local function mod_func() return {} end - local function my_searcher(name) - if name == "my.module" then - print("package.searchers", "my.module found") - return mod_func - end - end - local function my_searcher2(name) - if name == "my.module" then - print("package.searchers", "my.module found 2") - return mod_func - end - end - table.insert(package.searchers, my_searcher) - require("my.module") - package.loaded["my.module"] = nil - local new_s = { my_searcher2 } - for i,f in ipairs(package.searchers) do - new_s[i+1] = f - end - package.searchers = new_s - require("my.module") -end - - -___'' -do - print("string.find()", string.find("abc\0abc\0abc", "[^a\0]+")) - print("string.find()", string.find("abc\0abc\0abc", "%w+\0", 5)) - for x in string.gmatch("abc\0def\0ghi", "[^\0]+") do - print("string.gmatch()", x) - end - for x in string.gmatch("abc\0def\0ghi", "%w*\0") do - print("string.gmatch()", #x) - end - print("string.gsub()", string.gsub("abc\0def\0ghi", "[\0]", "X")) - print("string.gsub()", string.gsub("abc\0def\0ghi", "%w*\0", "X")) - print("string.gsub()", string.gsub("abc\0def\0ghi", "%A", "X")) - print("string.match()", string.match("abc\0abc\0abc", "([^\0a]+)")) - print("string.match()", #string.match("abc\0abc\0abc", ".*\0")) - print("string.rep()", string.rep("a", 0)) - print("string.rep()", string.rep("b", 1)) - print("string.rep()", string.rep("c", 4)) - print("string.rep()", string.rep("a", 0, "|")) - print("string.rep()", string.rep("b", 1, "|")) - print("string.rep()", string.rep("c", 4, "|")) - local _tostring = tostring - function tostring(v) - if type(v) == "number" then - return "(".._tostring(v)..")" - else - return _tostring(v) - end - end - print("string.format()", string.format("%q", "\"\\\0000\0010\002\r\n0\t0\"")) - print("string.format()", string.format("%12.3fx%%sxx%.6s", 3.1, {})) - print("string.format()", string.format("%-3f %%%s %%s", 3.1, true)) - print("string.format()", string.format("% 3.2g %%d %%%s", 3.1, nil)) - print("string.format()", string.format("%+3d %%d %%%%%10.6s", 3, io.stdout)) - print("string.format()", pcall(function() - print("string.format()", string.format("%d %%s", {})) - end)) - tostring = _tostring -end - - -___'' -do - print("io.write()", io.type(io.write("hello world\n"))) - local f = assert(io.tmpfile()) - print("io.tmpfile => file:write()", io.type(f:write("hello world\n"))) - f:close() -end - - -___'' -do - writefile("data.txt", "123 18.8 hello world\ni'm here\n") - io.input("data.txt") - print("io.read()", io.read("*n", "*number", "*l", "*a")) - io.input("data.txt") - print("io.read()", io.read("n", "number", "l", "a")) - io.input(io.stdin) - if not is_puclua51 then - local f = assert(io.open("data.txt", "r")) - print("file:read()", f:read("*n", "*number", "*l", "*a")) - f:close() - f = assert(io.open("data.txt", "r")) - print("file:read()", f:read("n", "number", "l", "a")) - f:close() - os.remove("data.txt") - - local g = assert(io.open("data.txt", "w")) - print("io.open => file:write()", type(g:write("hello"))) - g:close() - end - os.remove("data.txt") -end - - -___'' -do - writefile("data.txt", "123 18.8 hello world\ni'm here\n") - for a,b in io.lines(self, 2, "*l") do - print("io.lines()", a, b) - break - end - for l in io.lines(self) do - print("io.lines()", l) - break - end - for n1,n2,rest in io.lines("data.txt", "*n", "n", "*a") do - print("io.lines()", n1, n2, rest) - end - for l in io.lines("data.txt") do - print("io.lines()", l) - end - print("io.lines()", pcall(function() - for l in io.lines("data.txt", "*x") do print(l) end - end)) - print("io.lines()", pcall(function() - for l in io.lines("no_such_file.txt") do print(l) end - end)) - if mode ~= "module" then - local f = assert(io.open(self, "r")) - print("io.type()", io.type(f)) - for a,b in f:lines(2, "*l") do - print("file:lines()", a, b) - break - end - f:close() - print("io.type()", io.type(f)) - f = assert(io.open("data.txt", "r")) - for n1,n2,rest in f:lines("*n", "n", "*a") do - print("file:lines()", n1, n2, rest) - end - f:close() - f = assert(io.open("data.txt", "r")) - for l in f:lines() do - print("file:lines()", l) - end - f:close() - print("file:lines()", pcall(function() - for l in f:lines() do print(l) end - end)) - print("file:lines()", pcall(function() - local f = assert(io.open("data.txt", "r")) - for l in f:lines("*l", "*x") do print(l) end - f:close() - end)) - end - os.remove("data.txt") - print("io.popen()", pcall(function() - local f = assert(io.popen("echo 'hello' && exit 0", "r")) - print("io.popen()", f:read("*a")) - print("io.popen()", f:close()) - end)) - print("io.popen()", pcall(function() - local f = assert(io.popen("echo 'hello' && exit 5", "r")) - print("io.type()", io.type(f)) - print("io.popen()", f:read("*a")) - print("io.popen()", f:close()) - print("io.type()", io.type(f)) - end)) -end -___'' - - -print("testing C API ...") -local mod = require("testmod") -___'' -print("isinteger", mod.isinteger(1)) -print("isinteger", mod.isinteger(0)) -print("isinteger", mod.isinteger(1234567)) -print("isinteger", mod.isinteger(12.3)) -print("isinteger", mod.isinteger(math.huge)) -print("isinteger", mod.isinteger(math.sqrt(-1))) - -___'' -print("rotate", mod.rotate(1, 1, 2, 3, 4, 5, 6)) -print("rotate", mod.rotate(-1, 1, 2, 3, 4, 5, 6)) -print("rotate", mod.rotate(4, 1, 2, 3, 4, 5, 6)) -print("rotate", mod.rotate(-4, 1, 2, 3, 4, 5, 6)) - -___'' -print("strtonum", mod.strtonum("+123")) -print("strtonum", mod.strtonum(" 123 ")) -print("strtonum", mod.strtonum("-1.23")) -print("strtonum", mod.strtonum(" 123 abc")) -print("strtonum", mod.strtonum("jkl")) - -___'' -local a, b, c = mod.requiref() -print("requiref", type(a), type(b), type(c), - a.boolean, b.boolean, c.boolean, - type(requiref1), type(requiref2), type(requiref3)) - -___'' -local c = coroutine.wrap(function() - mod.extraspace("uvw") - print("getextraspace", mod.extraspace()) - coroutine.yield() - print("getextraspace", mod.extraspace()) - coroutine.yield() - print("getextraspace", mod.extraspace()) -end) -c() -mod.extraspace("abc") -print("getextraspace", mod.extraspace()) -c() -local d = coroutine.wrap(function() - print("getextraspace", mod.extraspace()) - mod.extraspace("xyz") - print("getextraspace", mod.extraspace()) - coroutine.yield() - print("getextraspace", mod.extraspace()) - coroutine.yield() - print("getextraspace", mod.extraspace()) -end) -d() -print("getextraspace", mod.extraspace()) -mod.extraspace("123") -c() -d() - -___'' -local proxy, backend = {}, {} -setmetatable(proxy, { __index = backend, __newindex = backend }) -print("geti/seti", rawget(proxy, 1), rawget(backend, 1)) -print("geti/seti", mod.getseti(proxy, 1)) -print("geti/seti", rawget(proxy, 1), rawget(backend, 1)) -print("geti/seti", mod.getseti(proxy, 1)) -print("geti/seti", rawget(proxy, 1), rawget(backend, 1)) - --- tests for Lua 5.1 -___'' -print("tonumber", mod.tonumber(12)) -print("tonumber", mod.tonumber("12")) -print("tonumber", mod.tonumber("0")) -print("tonumber", mod.tonumber(false)) -print("tonumber", mod.tonumber("error")) - -___'' -print("tointeger", mod.tointeger(12)) -print("tointeger", mod.tointeger(12)) -print("tointeger", mod.tointeger(12.1)) -print("tointeger", mod.tointeger(12.9)) -print("tointeger", mod.tointeger(-12.1)) -print("tointeger", mod.tointeger(-12.9)) -print("tointeger", mod.tointeger("12")) -print("tointeger", mod.tointeger("0")) -print("tointeger", mod.tointeger(math.pi)) -print("tointeger", mod.tointeger(false)) -print("tointeger", mod.tointeger("error")) - -___'' -print("len", mod.len("123")) -print("len", mod.len({ 1, 2, 3})) -print("len", pcall(mod.len, true)) -local ud, meta = mod.newproxy() -meta.__len = function() return 5 end -print("len", mod.len(ud)) -meta.__len = function() return true end -print("len", pcall(mod.len, ud)) - -___'' -print("copy", mod.copy(true, "string", {}, 1)) - -___'' -print("rawgetp/rawsetp", mod.rawxetp()) -print("rawgetp/rawsetp", mod.rawxetp("I'm back")) - -___'' -print("globals", F(mod.globals()), mod.globals() == _G) - -___'' -local t = {} -print("getsubtable", F(mod.subtable(t))) -local x, msg = mod.subtable(t) -print("getsubtable", F(x, msg, x == t.xxx)) - -___'' -print("udata", F(mod.udata())) -print("udata", mod.udata("nosuchtype")) - -___'' -print("uservalue", F(mod.uservalue())) - -___'' -print("upvalues", mod.getupvalues()) - -___'' -print("absindex", mod.absindex("hi", true)) - -___'' -print("arith", mod.arith(2, 1)) -print("arith", mod.arith(3, 5)) - -___'' -print("compare", mod.compare(1, 1)) -print("compare", mod.compare(2, 1)) -print("compare", mod.compare(1, 2)) - -___'' -print("tolstring", mod.tolstring("string")) -local t = setmetatable({}, { - __tostring = function(v) return "mytable" end -}) -print("tolstring", mod.tolstring(t)) -local t = setmetatable({}, { - __tostring = function(v) return nil end -}) -print("tolstring", pcall(mod.tolstring, t)) -local ud, meta = mod.newproxy() -meta.__name = "XXX" -print("tolstring", mod.tolstring(ud):gsub(":.*$", ": yyy")) - -___'' -print("pushstring", mod.pushstring()) - -___'' -print("Buffer", mod.buffer()) - -___'' -print("execresult", mod.exec("exit 0")) -print("execresult", mod.exec("exit 1")) -print("execresult", mod.exec("exit 25")) - -___'' -do - local bin = string.dump(function() end) - local modes = { "t", "b", "bt" } - local codes = { - "", "return true", bin, "invalidsource", "\27invalidbinary" - } - for _,m in ipairs(modes) do - for i,c in ipairs(codes) do - print("loadbufferx", m, i, F(mod.loadstring(c, m))) - end - end - - ___'' - local bom = "\239\187\191" - local shebang = "#!/usr/bin/env lua\n" - codes[#codes+1] = bom .. shebang .. "return true" - codes[#codes+1] = bom .. shebang .. bin - codes[#codes+1] = bom .. shebang .. "invalidsource" - codes[#codes+1] = bom .. shebang .. "\027invalidbinary" - for _,m in ipairs(modes) do - for i,c in ipairs(codes) do - print("loadfilex", m, i, F(mod.loadfile(c, m))) - end - end -end -___'' - diff --git a/lib/compat53/tests/testmod.c b/lib/compat53/tests/testmod.c deleted file mode 100644 index 0d73ed4..0000000 --- a/lib/compat53/tests/testmod.c +++ /dev/null @@ -1,370 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include "compat-5.3.h" - - -static int test_isinteger (lua_State *L) { - lua_pushboolean(L, lua_isinteger(L, 1)); - return 1; -} - - -static int test_rotate (lua_State *L) { - int r = (int)luaL_checkinteger(L, 1); - int n = lua_gettop(L)-1; - luaL_argcheck(L, (r < 0 ? -r : r) <= n, 1, "not enough arguments"); - lua_rotate(L, 2, r); - return n; -} - - -static int test_str2num (lua_State *L) { - const char *s = luaL_checkstring(L, 1); - size_t len = lua_stringtonumber(L, s); - if (len == 0) - lua_pushnumber(L, 0); - lua_pushinteger(L, (lua_Integer)len); - return 2; -} - - -static int my_mod (lua_State *L ) { - lua_newtable(L); - lua_pushboolean(L, 1); - lua_setfield(L, -2, "boolean"); - return 1; -} - -static int test_requiref (lua_State *L) { - lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); - lua_newtable(L); - lua_pushboolean(L, 0); - lua_setfield(L, -2, "boolean"); - lua_setfield(L, -2, "requiref3"); - lua_pop(L, 1); - luaL_requiref(L, "requiref1", my_mod, 0); - luaL_requiref(L, "requiref2", my_mod, 1); - luaL_requiref(L, "requiref3", my_mod, 1); - return 3; -} - -static int test_getseti (lua_State *L) { - lua_Integer k = luaL_checkinteger(L, 2); - lua_Integer n = 0; - if (lua_geti(L, 1, k) == LUA_TNUMBER) { - n = lua_tointeger(L, -1); - } else { - lua_pop(L, 1); - lua_pushinteger(L, n); - } - lua_pushinteger(L, n+1); - lua_seti(L, 1, k); - return 1; -} - - -#ifndef LUA_EXTRASPACE -#define LUA_EXTRASPACE (sizeof(void*)) -#endif - -static int test_getextraspace (lua_State *L) { - size_t len = 0; - char const* s = luaL_optlstring(L, 1, NULL, &len); - char* p = (char*)lua_getextraspace(L); - lua_pushstring(L, p); - if (s) - memcpy(p, s, len > LUA_EXTRASPACE-1 ? LUA_EXTRASPACE-1 : len+1); - return 1; -} - - -/* additional tests for Lua5.1 */ -#define NUP 3 - -static int test_newproxy (lua_State *L) { - lua_settop(L, 0); - lua_newuserdata(L, 0); - lua_newtable(L); - lua_pushvalue(L, -1); - lua_pushboolean(L, 1); - lua_setfield(L, -2, "__gc"); - lua_setmetatable(L, -3); - return 2; -} - -static int test_absindex (lua_State *L) { - int i = 1; - for (i = 1; i <= NUP; ++i) - lua_pushvalue(L, lua_absindex(L, lua_upvalueindex(i))); - lua_pushvalue(L, lua_absindex(L, LUA_REGISTRYINDEX)); - lua_pushstring(L, lua_typename(L, lua_type(L, lua_absindex(L, -1)))); - lua_replace(L, lua_absindex(L, -2)); - lua_pushvalue(L, lua_absindex(L, -2)); - lua_pushvalue(L, lua_absindex(L, -4)); - lua_pushvalue(L, lua_absindex(L, -6)); - i += 3; - lua_pushvalue(L, lua_absindex(L, 1)); - lua_pushvalue(L, lua_absindex(L, 2)); - lua_pushvalue(L, lua_absindex(L, 3)); - i += 3; - return i; -} - -static int test_arith (lua_State *L) { - lua_settop(L, 2); - lua_pushvalue(L, 1); - lua_pushvalue(L, 2); - lua_arith(L, LUA_OPADD); - lua_pushvalue(L, 1); - lua_pushvalue(L, 2); - lua_arith(L, LUA_OPSUB); - lua_pushvalue(L, 1); - lua_pushvalue(L, 2); - lua_arith(L, LUA_OPMUL); - lua_pushvalue(L, 1); - lua_pushvalue(L, 2); - lua_arith(L, LUA_OPDIV); - lua_pushvalue(L, 1); - lua_pushvalue(L, 2); - lua_arith(L, LUA_OPMOD); - lua_pushvalue(L, 1); - lua_pushvalue(L, 2); - lua_arith(L, LUA_OPPOW); - lua_pushvalue(L, 1); - lua_arith(L, LUA_OPUNM); - return lua_gettop(L)-2; -} - -static int test_compare (lua_State *L) { - luaL_checknumber(L, 1); - luaL_checknumber(L, 2); - lua_settop(L, 2); - lua_pushboolean(L, lua_compare(L, 1, 2, LUA_OPEQ)); - lua_pushboolean(L, lua_compare(L, 1, 2, LUA_OPLT)); - lua_pushboolean(L, lua_compare(L, 1, 2, LUA_OPLE)); - return 3; -} - -static int test_globals (lua_State *L) { - lua_pushglobaltable(L); - return 1; -} - -static int test_tonumber (lua_State *L) { - int isnum = 0; - lua_Number n = lua_tonumberx(L, 1, &isnum); - if (!isnum) - lua_pushnil(L); - else - lua_pushnumber(L, n); - return 1; -} - -static int test_tointeger (lua_State *L) { - int isnum = 0; - lua_Integer n = lua_tointegerx(L, 1, &isnum); - if (!isnum) - lua_pushnil(L); - else - lua_pushinteger(L, n); - lua_pushinteger(L, lua_tointeger(L, 1)); - return 2; -} - -static int test_len (lua_State *L) { - luaL_checkany(L, 1); - lua_len(L, 1); - lua_pushinteger(L, luaL_len(L, 1)); - return 2; -} - -static int test_copy (lua_State *L) { - int args = lua_gettop(L); - if (args >= 2) { - int i = 0; - for (i = args-1; i > 0; --i) - lua_copy(L, args, i); - } - return args; -} - -/* need an address */ -static char const dummy = 0; - -static int test_rawxetp (lua_State *L) { - if (lua_gettop(L) > 0) - lua_pushvalue(L, 1); - else - lua_pushliteral(L, "hello again"); - lua_rawsetp(L, LUA_REGISTRYINDEX, &dummy); - lua_settop(L, 0); - lua_rawgetp(L, LUA_REGISTRYINDEX, &dummy); - return 1; -} - -static int test_udata (lua_State *L) { - const char *tname = luaL_optstring(L, 1, "utype1"); - void *u1 = lua_newuserdata(L, 1); - int u1pos = lua_gettop(L); - void *u2 = lua_newuserdata(L, 1); - int u2pos = lua_gettop(L); - luaL_newmetatable(L, "utype1"); - luaL_newmetatable(L, "utype2"); - lua_pop(L, 2); - luaL_setmetatable(L, "utype2"); - lua_pushvalue(L, u1pos); - luaL_setmetatable(L, "utype1"); - lua_pop(L, 1); - (void)u1; - (void)u2; - lua_pushlightuserdata(L, luaL_testudata(L, u1pos, tname)); - lua_pushlightuserdata(L, luaL_testudata(L, u2pos, tname)); - luaL_getmetatable(L, "utype1"); - lua_getfield(L, -1, "__name"); - lua_replace(L, -2); - return 3; -} - -static int test_subtable (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - lua_settop(L, 1); - if (luaL_getsubtable(L, 1, "xxx")) { - lua_pushliteral(L, "oldtable"); - } else { - lua_pushliteral(L, "newtable"); - } - return 2; -} - -static int test_uservalue (lua_State *L) { - void *udata = lua_newuserdata(L, 1); - int ui = lua_gettop(L); - lua_newtable(L); - lua_setuservalue(L, ui); - lua_pushinteger(L, lua_getuservalue(L, ui)); - (void)udata; - return 2; -} - -static int test_upvalues (lua_State *L) { - int i = 1; - for (i = 1; i <= NUP; ++i) - lua_pushvalue(L, lua_upvalueindex(i)); - return NUP; -} - -static int test_tolstring (lua_State *L) { - size_t len = 0; - luaL_tolstring(L, 1, &len); - lua_pushinteger(L, (int)len); - return 2; -} - -static int test_pushstring (lua_State *L) { - lua_pushstring(L, lua_pushliteral(L, "abc")); - lua_pushstring(L, lua_pushlstring(L, "abc", 2)); - lua_pushstring(L, lua_pushlstring(L, NULL, 0)); - lua_pushstring(L, lua_pushstring(L, "abc")); - lua_pushboolean(L, NULL == lua_pushstring(L, NULL)); - return 10; -} - -static int test_buffer (lua_State *L) { - luaL_Buffer b; - char *p = luaL_buffinitsize(L, &b, LUAL_BUFFERSIZE+1); - p[0] = 'a'; - p[1] = 'b'; - luaL_addsize(&b, 2); - luaL_addstring(&b, "c"); - lua_pushliteral(L, "d"); - luaL_addvalue(&b); - luaL_addchar(&b, 'e'); - luaL_pushresult(&b); - return 1; -} - -static int test_exec (lua_State *L) { - const char *cmd = luaL_checkstring(L, 1); - errno = 0; - return luaL_execresult(L, system(cmd)); -} - -static int test_loadstring (lua_State *L) { - size_t len = 0; - char const* s = luaL_checklstring(L, 1, &len); - char const* mode = luaL_optstring(L, 2, "bt"); - lua_pushinteger(L, luaL_loadbufferx(L, s, len, s, mode)); - return 2; -} - -static int test_loadfile (lua_State *L) { - char filename[L_tmpnam+1] = { 0 }; - size_t len = 0; - char const* s = luaL_checklstring(L, 1, &len); - char const* mode = luaL_optstring(L, 2, "bt"); - if (tmpnam(filename)) { - FILE* f = fopen(filename, "wb"); - if (f) { - fwrite(s, 1, len, f); - fclose(f); - lua_pushinteger(L, luaL_loadfilex(L, filename, mode)); - remove(filename); - return 2; - } else - remove(filename); - } - return 0; -} - - -static const luaL_Reg funcs[] = { - { "isinteger", test_isinteger }, - { "rotate", test_rotate }, - { "strtonum", test_str2num }, - { "requiref", test_requiref }, - { "getseti", test_getseti }, - { "extraspace", test_getextraspace }, - { "newproxy", test_newproxy }, - { "arith", test_arith }, - { "compare", test_compare }, - { "tonumber", test_tonumber }, - { "tointeger", test_tointeger }, - { "len", test_len }, - { "copy", test_copy }, - { "rawxetp", test_rawxetp }, - { "subtable", test_subtable }, - { "udata", test_udata }, - { "uservalue", test_uservalue }, - { "globals", test_globals }, - { "tolstring", test_tolstring }, - { "pushstring", test_pushstring }, - { "buffer", test_buffer }, - { "exec", test_exec }, - { "loadstring", test_loadstring }, - { "loadfile", test_loadfile }, - { NULL, NULL } -}; - -static const luaL_Reg more_funcs[] = { - { "getupvalues", test_upvalues }, - { "absindex", test_absindex }, - { NULL, NULL } -}; - - -#ifdef __cplusplus -extern "C" { -#endif -int luaopen_testmod (lua_State *L) { - int i = 1; - luaL_newlib(L, funcs); - for (i = 1; i <= NUP; ++i) - lua_pushnumber(L, i); - luaL_setfuncs(L, more_funcs, NUP); - return 1; -} -#ifdef __cplusplus -} -#endif - |
