From 1833c57d4d4ba240042a19d62f4f09c8a4db44d9 Mon Sep 17 00:00:00 2001 From: Enrico Horn Date: Sun, 11 Jul 2021 22:59:08 +0200 Subject: [PATCH] Extract luaj3.0-tests.zip to luaj-test/src/test/resources and delete it --- .../resources/{ => compatibility}/baselib.lua | 0 .../test/resources/compatibility/baselib.out | 240 ++ .../{ => compatibility}/coroutinelib.lua | 0 .../resources/compatibility/coroutinelib.out | 74 + .../{ => compatibility}/debuglib.lua | 0 .../test/resources/compatibility/debuglib.out | 329 +++ .../resources/{ => compatibility}/errors.lua | 0 .../test/resources/compatibility/errors.out | 97 + .../{ => compatibility}/functions.lua | 0 .../resources/compatibility/functions.out | 68 + .../resources/{ => compatibility}/iolib.lua | 0 .../test/resources/compatibility/iolib.out | 96 + .../compatibility/luajit/debuglib.out | 321 +++ .../{ => compatibility}/manyupvals.lua | 0 .../resources/compatibility/manyupvals.out | 1981 +++++++++++++++++ .../resources/{ => compatibility}/mathlib.lua | 0 .../test/resources/compatibility/mathlib.out | 842 +++++++ .../{ => compatibility}/metatags.lua | 0 .../test/resources/compatibility/metatags.out | 649 ++++++ .../resources/{ => compatibility}/oslib.lua | 0 .../test/resources/compatibility/oslib.out | 49 + .../{ => compatibility}/stringlib.lua | 0 .../resources/compatibility/stringlib.out | Bin 0 -> 10276 bytes .../{ => compatibility}/tablelib.lua | 0 .../test/resources/compatibility/tablelib.out | 245 ++ .../{ => compatibility}/tailcalls.lua | 0 .../resources/compatibility/tailcalls.out | 211 ++ .../{ => compatibility}/upvalues.lua | 0 .../test/resources/compatibility/upvalues.out | 23 + .../test/resources/{ => compatibility}/vm.lua | 0 .../src/test/resources/compatibility/vm.out | 418 ++++ .../resources/errors/{abc.txt => args.out} | 0 .../src/test/resources/errors/baselibargs.out | 530 +++++ .../resources/errors/coroutinelibargs.out | 65 + .../test/resources/errors/debuglibargs.out | 452 ++++ .../src/test/resources/errors/iolibargs.out | 202 ++ .../src/test/resources/errors/mathlibargs.out | 750 +++++++ .../test/resources/errors/modulelibargs.out | 33 + .../src/test/resources/errors/operators.out | 837 +++++++ .../src/test/resources/errors/seektest.txt | 0 .../test/resources/errors/stringlibargs.out | Bin 0 -> 34227 bytes .../test/resources/errors/tablelibargs.out | 283 +++ .../src/test/resources/lua5.2.1-tests/all.lc | Bin 0 -> 9193 bytes .../src/test/resources/lua5.2.1-tests/all.lua | 236 ++ .../src/test/resources/lua5.2.1-tests/api.lc | Bin 0 -> 54535 bytes .../src/test/resources/lua5.2.1-tests/api.lua | 1009 +++++++++ .../test/resources/lua5.2.1-tests/attrib.lc | Bin 0 -> 21628 bytes .../test/resources/lua5.2.1-tests/attrib.lua | 420 ++++ .../src/test/resources/lua5.2.1-tests/big.lc | Bin 0 -> 4152 bytes .../src/test/resources/lua5.2.1-tests/big.lua | 79 + .../test/resources/lua5.2.1-tests/bitwise.lc | Bin 0 -> 9269 bytes .../test/resources/lua5.2.1-tests/bitwise.lua | 115 + .../test/resources/lua5.2.1-tests/calls.lc | Bin 0 -> 17571 bytes .../test/resources/lua5.2.1-tests/calls.lua | 305 +++ .../resources/lua5.2.1-tests/checktable.lc | Bin 0 -> 4107 bytes .../resources/lua5.2.1-tests/checktable.lua | 77 + .../test/resources/lua5.2.1-tests/closure.lc | Bin 0 -> 13362 bytes .../test/resources/lua5.2.1-tests/closure.lua | 244 ++ .../src/test/resources/lua5.2.1-tests/code.lc | Bin 0 -> 8292 bytes .../test/resources/lua5.2.1-tests/code.lua | 182 ++ .../resources/lua5.2.1-tests/constructs.lc | Bin 0 -> 17248 bytes .../resources/lua5.2.1-tests/constructs.lua | 310 +++ .../resources/lua5.2.1-tests/coroutine.lc | Bin 0 -> 38813 bytes .../resources/lua5.2.1-tests/coroutine.lua | 728 ++++++ .../src/test/resources/lua5.2.1-tests/db.lc | Bin 0 -> 34979 bytes .../src/test/resources/lua5.2.1-tests/db.lua | 631 ++++++ .../test/resources/lua5.2.1-tests/errors.lc | Bin 0 -> 20157 bytes .../test/resources/lua5.2.1-tests/errors.lua | 422 ++++ .../test/resources/lua5.2.1-tests/events.lc | Bin 0 -> 24438 bytes .../test/resources/lua5.2.1-tests/events.lua | 388 ++++ .../test/resources/lua5.2.1-tests/files.lc | Bin 0 -> 32865 bytes .../test/resources/lua5.2.1-tests/files.lua | 605 +++++ .../src/test/resources/lua5.2.1-tests/gc.lc | Bin 0 -> 27084 bytes .../src/test/resources/lua5.2.1-tests/gc.lua | 574 +++++ .../src/test/resources/lua5.2.1-tests/goto.lc | Bin 0 -> 4698 bytes .../test/resources/lua5.2.1-tests/goto.lua | 173 ++ .../test/resources/lua5.2.1-tests/literals.lc | Bin 0 -> 14000 bytes .../resources/lua5.2.1-tests/literals.lua | 258 +++ .../test/resources/lua5.2.1-tests/locals.lc | Bin 0 -> 6848 bytes .../test/resources/lua5.2.1-tests/locals.lua | 157 ++ .../src/test/resources/lua5.2.1-tests/main.lc | Bin 0 -> 10329 bytes .../test/resources/lua5.2.1-tests/main.lua | 260 +++ .../src/test/resources/lua5.2.1-tests/math.lc | Bin 0 -> 17525 bytes .../test/resources/lua5.2.1-tests/math.lua | 293 +++ .../test/resources/lua5.2.1-tests/nextvar.lc | Bin 0 -> 25397 bytes .../test/resources/lua5.2.1-tests/nextvar.lua | 447 ++++ .../src/test/resources/lua5.2.1-tests/pm.lc | Bin 0 -> 25824 bytes .../src/test/resources/lua5.2.1-tests/pm.lua | 319 +++ .../src/test/resources/lua5.2.1-tests/sort.lc | Bin 0 -> 10270 bytes .../test/resources/lua5.2.1-tests/sort.lua | 167 ++ .../test/resources/lua5.2.1-tests/strings.lc | Bin 0 -> 22300 bytes .../test/resources/lua5.2.1-tests/strings.lua | 281 +++ .../test/resources/lua5.2.1-tests/vararg.lc | Bin 0 -> 7541 bytes .../test/resources/lua5.2.1-tests/vararg.lua | 125 ++ .../test/resources/lua5.2.1-tests/verybig.lc | Bin 0 -> 8755 bytes .../test/resources/lua5.2.1-tests/verybig.lua | 144 ++ .../test/resources/luaj3.0-tests/baselib.lua | 277 +++ .../resources/luaj3.0-tests/coroutinelib.lua | 126 ++ .../test/resources/luaj3.0-tests/debuglib.lua | 280 +++ .../test/resources/luaj3.0-tests/errors.lua | 137 ++ .../resources/luaj3.0-tests/functions.lua | 74 + .../test/resources/luaj3.0-tests/iolib.lua | 153 ++ .../resources/luaj3.0-tests/manyupvals.lua | 37 + .../test/resources/luaj3.0-tests/mathlib.lua | 239 ++ .../test/resources/luaj3.0-tests/metatags.lua | 286 +++ .../test/resources/luaj3.0-tests/oslib.lua | 39 + .../resources/luaj3.0-tests/stringlib.lua | 189 ++ .../test/resources/luaj3.0-tests/tablelib.lua | 284 +++ .../resources/luaj3.0-tests/tailcalls.lua | 153 ++ .../test/resources/luaj3.0-tests/upvalues.lua | 97 + .../src/test/resources/luaj3.0-tests/vm.lua | 250 +++ .../src/test/resources/perf/binarytrees.out | 4 + .../src/test/resources/perf/fannkuch.out | 2 + luaj-test/src/test/resources/perf/nbody.out | 2 + luaj-test/src/test/resources/perf/nsieve.out | 3 + .../resources/regressions-mingw/bigattr.lua | 2 + .../regressions-mingw/comparators.lua | 3 + .../resources/regressions-mingw/construct.lua | 1 + .../regressions-mingw/controlchars.lua | 2 + .../regressions-mingw/mathrandomseed.lua | 1 + .../resources/regressions-mingw/modulo.lua | 4 + .../resources/regressions-mingw/varargs.lua | 29 + .../src/test/resources/regressions/bigattr.lc | Bin 0 -> 230 bytes .../test/resources/regressions/bigattr.lua | 2 + .../test/resources/regressions/comparators.lc | Bin 0 -> 254 bytes .../resources/regressions/comparators.lua | 3 + .../test/resources/regressions/construct.lc | Bin 0 -> 186 bytes .../test/resources/regressions/construct.lua | 1 + .../resources/regressions/controlchars.lc | Bin 0 -> 247 bytes .../resources/regressions/controlchars.lua | 2 + .../resources/regressions/mathrandomseed.lc | Bin 0 -> 183 bytes .../resources/regressions/mathrandomseed.lua | 1 + .../src/test/resources/regressions/modulo.lc | Bin 0 -> 212 bytes .../src/test/resources/regressions/modulo.lua | 4 + .../src/test/resources/regressions/varargs.lc | Bin 0 -> 2173 bytes .../test/resources/regressions/varargs.lua | 29 + luaj-test/test/lua/luaj3.0-tests.zip | Bin 323550 -> 0 bytes luaj-test/test/lua/repack.sh | 39 - 138 files changed, 20460 insertions(+), 39 deletions(-) rename luaj-test/src/test/resources/{ => compatibility}/baselib.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/baselib.out rename luaj-test/src/test/resources/{ => compatibility}/coroutinelib.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/coroutinelib.out rename luaj-test/src/test/resources/{ => compatibility}/debuglib.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/debuglib.out rename luaj-test/src/test/resources/{ => compatibility}/errors.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/errors.out rename luaj-test/src/test/resources/{ => compatibility}/functions.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/functions.out rename luaj-test/src/test/resources/{ => compatibility}/iolib.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/iolib.out create mode 100644 luaj-test/src/test/resources/compatibility/luajit/debuglib.out rename luaj-test/src/test/resources/{ => compatibility}/manyupvals.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/manyupvals.out rename luaj-test/src/test/resources/{ => compatibility}/mathlib.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/mathlib.out rename luaj-test/src/test/resources/{ => compatibility}/metatags.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/metatags.out rename luaj-test/src/test/resources/{ => compatibility}/oslib.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/oslib.out rename luaj-test/src/test/resources/{ => compatibility}/stringlib.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/stringlib.out rename luaj-test/src/test/resources/{ => compatibility}/tablelib.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/tablelib.out rename luaj-test/src/test/resources/{ => compatibility}/tailcalls.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/tailcalls.out rename luaj-test/src/test/resources/{ => compatibility}/upvalues.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/upvalues.out rename luaj-test/src/test/resources/{ => compatibility}/vm.lua (100%) create mode 100644 luaj-test/src/test/resources/compatibility/vm.out rename luaj-test/src/test/resources/errors/{abc.txt => args.out} (100%) create mode 100644 luaj-test/src/test/resources/errors/baselibargs.out create mode 100644 luaj-test/src/test/resources/errors/coroutinelibargs.out create mode 100644 luaj-test/src/test/resources/errors/debuglibargs.out create mode 100644 luaj-test/src/test/resources/errors/iolibargs.out create mode 100644 luaj-test/src/test/resources/errors/mathlibargs.out create mode 100644 luaj-test/src/test/resources/errors/modulelibargs.out create mode 100644 luaj-test/src/test/resources/errors/operators.out delete mode 100644 luaj-test/src/test/resources/errors/seektest.txt create mode 100644 luaj-test/src/test/resources/errors/stringlibargs.out create mode 100644 luaj-test/src/test/resources/errors/tablelibargs.out create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/all.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/all.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/api.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/api.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/attrib.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/attrib.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/big.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/big.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/calls.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/calls.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/checktable.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/checktable.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/closure.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/closure.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/code.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/code.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/constructs.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/constructs.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/db.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/db.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/errors.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/errors.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/events.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/events.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/files.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/files.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/gc.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/gc.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/goto.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/goto.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/literals.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/literals.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/locals.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/locals.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/main.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/main.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/math.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/math.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/nextvar.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/nextvar.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/pm.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/pm.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/sort.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/sort.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/strings.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/strings.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/vararg.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/vararg.lua create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/verybig.lc create mode 100644 luaj-test/src/test/resources/lua5.2.1-tests/verybig.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/baselib.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/coroutinelib.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/debuglib.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/errors.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/functions.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/iolib.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/manyupvals.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/mathlib.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/metatags.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/oslib.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/stringlib.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/tablelib.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/tailcalls.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/upvalues.lua create mode 100644 luaj-test/src/test/resources/luaj3.0-tests/vm.lua create mode 100644 luaj-test/src/test/resources/perf/binarytrees.out create mode 100644 luaj-test/src/test/resources/perf/fannkuch.out create mode 100644 luaj-test/src/test/resources/perf/nbody.out create mode 100644 luaj-test/src/test/resources/perf/nsieve.out create mode 100644 luaj-test/src/test/resources/regressions-mingw/bigattr.lua create mode 100644 luaj-test/src/test/resources/regressions-mingw/comparators.lua create mode 100644 luaj-test/src/test/resources/regressions-mingw/construct.lua create mode 100644 luaj-test/src/test/resources/regressions-mingw/controlchars.lua create mode 100644 luaj-test/src/test/resources/regressions-mingw/mathrandomseed.lua create mode 100644 luaj-test/src/test/resources/regressions-mingw/modulo.lua create mode 100644 luaj-test/src/test/resources/regressions-mingw/varargs.lua create mode 100644 luaj-test/src/test/resources/regressions/bigattr.lc create mode 100644 luaj-test/src/test/resources/regressions/bigattr.lua create mode 100644 luaj-test/src/test/resources/regressions/comparators.lc create mode 100644 luaj-test/src/test/resources/regressions/comparators.lua create mode 100644 luaj-test/src/test/resources/regressions/construct.lc create mode 100644 luaj-test/src/test/resources/regressions/construct.lua create mode 100644 luaj-test/src/test/resources/regressions/controlchars.lc create mode 100644 luaj-test/src/test/resources/regressions/controlchars.lua create mode 100644 luaj-test/src/test/resources/regressions/mathrandomseed.lc create mode 100644 luaj-test/src/test/resources/regressions/mathrandomseed.lua create mode 100644 luaj-test/src/test/resources/regressions/modulo.lc create mode 100644 luaj-test/src/test/resources/regressions/modulo.lua create mode 100644 luaj-test/src/test/resources/regressions/varargs.lc create mode 100644 luaj-test/src/test/resources/regressions/varargs.lua delete mode 100644 luaj-test/test/lua/luaj3.0-tests.zip delete mode 100644 luaj-test/test/lua/repack.sh diff --git a/luaj-test/src/test/resources/baselib.lua b/luaj-test/src/test/resources/compatibility/baselib.lua similarity index 100% rename from luaj-test/src/test/resources/baselib.lua rename to luaj-test/src/test/resources/compatibility/baselib.lua diff --git a/luaj-test/src/test/resources/compatibility/baselib.out b/luaj-test/src/test/resources/compatibility/baselib.out new file mode 100644 index 00000000..c3b5c1da --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/baselib.out @@ -0,0 +1,240 @@ + +11 +abc 123 nil pqr +F +F +T +assert(true) true +pcall(assert,true) true +pcall(assert,false) false string +pcall(assert,nil) false string +pcall(assert,true,"msg") true +pcall(assert,false,"msg") false string +pcall(assert,nil,"msg") false string +pcall(assert,false,"msg","msg2") false string +collectgarbage("count") number +collectgarbage("collect") number +collectgarbage("count") number +pcall(ipairs) false string +pcall(ipairs,nil) false string +pcall(ipairs,"a") false string +pcall(ipairs,1) false string +ipairs2 1 one +ipairs2 2 two +ipairs4 1 one +ipairs4 2 two +table loaded +load: nil +load("print(3+4); return 8") func.1 nil +7 +load("print(3+4); return 8")() 8 +pcall(pairs) false string +pcall(pairs,nil) false string +pcall(pairs,"a") false string +pcall(pairs,1) false string +pairs2 1 one +pairs2 2 two +pairs3 aa aaa +pairs4 1 one +pairs4 2 two +pairs4 aa aaa +pairs5 20 30 +pairs5 30 20 +_G["abc"] (before) nil +_G["abc"] (after) def +type(nil) nil +type("a") string +type(1) number +type(1.5) number +type(function() end) function +type({}) table +type(true) boolean +type(false) boolean +pcall(type,type) function +pcall(type) false string +(function() return pcall(type) end)() false string +la() false string +ga() false string +getmetatable(ta) nil +getmetatable(tb) nil +setmetatable(ta),{cc1="ccc1"} table +setmetatable(tb),{dd1="ddd1"} table +getmetatable(ta)["cc1"] ccc1 +getmetatable(tb)["dd1"] ddd1 +getmetatable(1) nil +pcall(setmetatable,1) false string +pcall(setmetatable,nil) false string +pcall(setmetatable,"ABC") false string +pcall(setmetatable,function() end) false string +pcall(rawget) false string +pcall(rawget,"a") false string +pcall(rawget,s) false string +pcall(rawget,t) false string + s nil nil ccc ddd nil nil nil + s nil nil ccc ddd nil nil nil + t aaa bbb ccc ddd nil nil nil + t nil nil ccc ddd nil nil nil + mt aaa bbb nil nil nil nil nil + mt aaa bbb nil nil nil nil nil +pcall(rawset,s,"aa","www") tbl.2 + s www nil ccc ddd nil nil nil + s www nil ccc ddd nil nil nil + t aaa bbb ccc ddd nil nil nil + t nil nil ccc ddd nil nil nil + mt aaa bbb nil nil nil nil nil + mt aaa bbb nil nil nil nil nil +pcall(rawset,s,"cc","xxx") tbl.2 + s www nil xxx ddd nil nil nil + s www nil xxx ddd nil nil nil + t aaa bbb ccc ddd nil nil nil + t nil nil ccc ddd nil nil nil + mt aaa bbb nil nil nil nil nil + mt aaa bbb nil nil nil nil nil +pcall(rawset,t,"aa","yyy") tbl.3 + s www nil xxx ddd nil nil nil + s www nil xxx ddd nil nil nil + t yyy bbb ccc ddd nil nil nil + t yyy nil ccc ddd nil nil nil + mt aaa bbb nil nil nil nil nil + mt aaa bbb nil nil nil nil nil +pcall(rawset,t,"dd","zzz") tbl.3 + s www nil xxx ddd nil nil nil + s www nil xxx ddd nil nil nil + t yyy bbb ccc zzz nil nil nil + t yyy nil ccc zzz nil nil nil + mt aaa bbb nil nil nil nil nil + mt aaa bbb nil nil nil nil nil +pcall(rawlen, {}) 0 +pcall(rawlen, {"a"}) 1 +pcall(rawlen, {"a","b"}) 2 +pcall(rawlen, "") 0 +pcall(rawlen, "a") 1 +pcall(rawlen, "ab") 2 +pcall(rawlen, 1) false string +pcall(rawlen, nil) false string +pcall(rawlen) false string + s www nil xxx ddd nil nil nil + s www nil xxx ddd nil nil nil + t yyy bbb ccc zzz nil nil nil + t yyy nil ccc zzz nil nil nil + mt aaa bbb nil nil nil nil nil + mt aaa bbb nil nil nil nil nil +s["ee"]="ppp" + s www nil xxx ddd ppp nil nil + s www nil xxx ddd ppp nil nil + t yyy bbb ccc zzz nil nil nil + t yyy nil ccc zzz nil nil nil + mt aaa bbb nil nil nil nil nil + mt aaa bbb nil nil nil nil nil +s["cc"]="qqq" + s www nil qqq ddd ppp nil nil + s www nil qqq ddd ppp nil nil + t yyy bbb ccc zzz nil nil nil + t yyy nil ccc zzz nil nil nil + mt aaa bbb nil nil nil nil nil + mt aaa bbb nil nil nil nil nil +t["ff"]="rrr" + s www nil qqq ddd ppp nil nil + s www nil qqq ddd ppp nil nil + t yyy bbb ccc zzz nil rrr nil + t yyy nil ccc zzz nil nil nil + mt aaa bbb nil nil nil rrr nil + mt aaa bbb nil nil nil rrr nil +t["dd"]="sss" + s www nil qqq ddd ppp nil nil + s www nil qqq ddd ppp nil nil + t yyy bbb ccc sss nil rrr nil + t yyy nil ccc sss nil nil nil + mt aaa bbb nil nil nil rrr nil + mt aaa bbb nil nil nil rrr nil +mt["gg"]="ttt" + s www nil qqq ddd ppp nil nil + s www nil qqq ddd ppp nil nil + t yyy bbb ccc sss nil rrr ttt + t yyy nil ccc sss nil nil nil + mt aaa bbb nil nil nil rrr ttt + mt aaa bbb nil nil nil rrr ttt +pcall(select) false string +select(1,11,22,33,44,55) 11 22 33 44 55 +select(2,11,22,33,44,55) 22 33 44 55 +select(3,11,22,33,44,55) 33 44 55 +select(4,11,22,33,44,55) 44 55 +pcall(select,5,11,22,33,44,55) 55 +pcall(select,6,11,22,33,44,55) nil +pcall(select,7,11,22,33,44,55) nil +pcall(select,0,11,22,33,44,55) false string +pcall(select,-1,11,22,33,44,55) 55 +pcall(select,-2,11,22,33,44,55) 44 +pcall(select,-4,11,22,33,44,55) 22 +pcall(select,-5,11,22,33,44,55) 11 +pcall(select,-6,11,22,33,44,55) false string +pcall(select,1) nil +pcall(select,select) false string +pcall(select,{}) false string +pcall(select,"2",11,22,33) 22 +pcall(select,"abc",11,22,33) false string +pcall(tonumber) nil +pcall(tonumber,nil) nil +pcall(tonumber,"abc") nil +pcall(tonumber,"123") 123 +pcall(tonumber,"123",10) 123 +pcall(tonumber,"123",8) 83 +pcall(tonumber,"123",6) 51 +pcall(tonumber,"10101",4) 273 +pcall(tonumber,"10101",3) 91 +pcall(tonumber,"10101",2) 21 +pcall(tonumber,"1a1",16) 417 +pcall(tonumber,"1a1",32) 1345 +pcall(tonumber,"1a1",54) false string +pcall(tonumber,"1a1",1) false string +pcall(tonumber,"1a1",0) false string +pcall(tonumber,"1a1",-1) false string +pcall(tonumber,"1a1","32") 1345 +pcall(tonumber,"123","456") false string +pcall(tonumber,"1a1",10) nil +pcall(tonumber,"151",4) nil +pcall(tonumber,"151",3) nil +pcall(tonumber,"151",2) nil +pcall(tonumber,"123",8,8) 83 +pcall(tonumber,123) 123 +pcall(tonumber,true) nil +pcall(tonumber,false) nil +pcall(tonumber,tonumber) nil +pcall(tonumber,function() end) nil +pcall(tonumber,{"one","two",a="aa",b="bb"}) nil +pcall(tonumber,"123.456") 123.456 +pcall(tonumber," 123.456") 123.456 +pcall(tonumber," 234qwer") nil +pcall(tonumber,"0x20") 32 +pcall(tonumber," 0x20") 32 +pcall(tonumber,"0x20 ") 32 +pcall(tonumber," 0x20 ") 32 +pcall(tonumber,"0X20") 32 +pcall(tonumber," 0X20") 32 +pcall(tonumber,"0X20 ") 32 +pcall(tonumber," 0X20 ") 32 +pcall(tonumber,"0x20",10) nil +pcall(tonumber,"0x20",16) nil +pcall(tonumber,"0x20",8) nil +pcall(tostring) nil +pcall(tostring,nil) nil +pcall(tostring,"abc") abc +pcall(tostring,"abc","def") abc +pcall(tostring,123) 123 +pcall(tostring,true) true +pcall(tostring,false) false +tostring(tostring) string +tostring(function() end) string +tostring({"one","two",a="aa",b="bb"}) string +_VERSION string +pcall(badfunc) false string +pcall(badfunc,errfunc) false string +pcall(badfunc,badfunc) false string +pcall(wrappedbad) nil +pcall(wrappedbad,errfunc) nil +pcall(xpcall(badfunc)) false string + in errfunc string +pcall(xpcall(badfunc,errfunc)) false +pcall(xpcall(badfunc,badfunc)) false +pcall(xpcall(wrappedbad)) false string +xpcall(wrappedbad,errfunc) true diff --git a/luaj-test/src/test/resources/coroutinelib.lua b/luaj-test/src/test/resources/compatibility/coroutinelib.lua similarity index 100% rename from luaj-test/src/test/resources/coroutinelib.lua rename to luaj-test/src/test/resources/compatibility/coroutinelib.lua diff --git a/luaj-test/src/test/resources/compatibility/coroutinelib.out b/luaj-test/src/test/resources/compatibility/coroutinelib.out new file mode 100644 index 00000000..7fff9194 --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/coroutinelib.out @@ -0,0 +1,74 @@ +running is not nil +co.status suspended +co-body 1 10 +foo 2 +main true 4 +co.status suspended +co-body r +main true 11 -9 +co.status suspended +co-body x y +running is not nil +co.status.inside running +co.status.inside running +co.status.inside2 normal +main true 10 end +co.status dead +main false cannot resume dead coroutine +co.status dead +running is not nil +co.status suspended +co-body 1 10 +foo 2 +main true 4 +co.status suspended +co-body nil nil +main true 11 -9 +co.status suspended +co-body x y +main true 10 end +co.status dead +main false cannot resume dead coroutine +co.status dead +co-body 1 10 +foo 2 +g 4 +co-body r +g 11 -9 +co-body x y +g 10 end +g cannot resume dead coroutine +(main) sending args 111 222 333 +(echocr) first args 111 222 333 +(main) resume returns true 111 222 333 +(main) sending args +(echoch) yield returns +(main) resume returns true +(main) sending args 111 +(echoch) yield returns 111 +(main) resume returns true 111 +(main) sending args 111 222 333 +(echoch) yield returns 111 222 333 +(main) resume returns true 111 222 333 +main-b suspended +main-c suspended + b-resumed main-arg-for-b true + b-b running + b-c suspended + b-resume-b false cannot resume non-suspended coroutine + c-resumed b-arg-for-c true + c-b normal + c-c running + c-resume-b false cannot resume non-suspended coroutine + c-resume-c false cannot resume non-suspended coroutine + b-resume-c false attempt to yield across metamethod/C-call boundary +main-resume-b false attempt to yield across metamethod/C-call boundary +main-resume-c false cannot resume dead coroutine +main-b dead +main-c dead +main-resume-b false cannot resume dead coroutine +main-resume-c false cannot resume dead coroutine +main-b dead +main-c dead +main-resume-b false cannot resume dead coroutine +main-resume-c false cannot resume dead coroutine diff --git a/luaj-test/src/test/resources/debuglib.lua b/luaj-test/src/test/resources/compatibility/debuglib.lua similarity index 100% rename from luaj-test/src/test/resources/debuglib.lua rename to luaj-test/src/test/resources/compatibility/debuglib.lua diff --git a/luaj-test/src/test/resources/compatibility/debuglib.out b/luaj-test/src/test/resources/compatibility/debuglib.out new file mode 100644 index 00000000..663fe0be --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/debuglib.out @@ -0,0 +1,329 @@ +has debug true +----- debug.getlocal, debug.setlocal +true h-3-0 -> 3-0 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={3,0,#} f locals=,3,0,#,4,5,6 +true h-3-1 -> 3-1 get=a,3 set=a,nil get=a,# g locals=7,8,9 tbl={3,1,#} f locals=,#,1,#,4,5,6 +true h-3-2 -> 3-2 get=b,2 set=b,nil get=b,# g locals=7,8,9 tbl={3,2,#} f locals=,3,#,#,4,5,6 +true h-3-3 -> 3-3 get=c,# set=c,nil get=c,# g locals=7,8,9 tbl={3,3,#} f locals=,3,3,#,4,5,6 +true h-3-4 -> 3-4 get=d,4 set=d,nil get=d,# g locals=7,8,9 tbl={3,4,#} f locals=,3,4,#,#,5,6 +true h-3-5 -> 3-5 get=e,5 set=e,nil get=e,# g locals=7,8,9 tbl={3,5,#} f locals=,3,5,#,4,#,6 +true h-3-6 -> 3-6 get=f,6 set=f,nil get=f,# g locals=7,8,9 tbl={3,6,#} f locals=,3,6,#,4,5,# +true h-3-7 -> 3-7 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={3,7,#} f locals=,3,7,#,4,5,6 +true h-2-0 -> 2-0 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,0,#} f locals=,2,0,#,4,5,6 +true h-2-1 -> 2-1 get=p,7 set=p,nil get=p,# g locals=#,8,9 tbl={2,1,#} f locals=,2,1,#,4,5,6 +true h-2-2 -> 2-2 get=q,8 set=q,nil get=q,# g locals=7,#,9 tbl={2,2,#} f locals=,2,2,#,4,5,6 +true h-2-3 -> 2-3 get=r,9 set=r,nil get=r,# g locals=7,8,# tbl={2,3,#} f locals=,2,3,#,4,5,6 +true h-2-4 -> 2-4 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,4,#} f locals=,2,4,#,4,5,6 +true h-2-5 -> 2-5 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,5,#} f locals=,2,5,#,4,5,6 +true h-2-6 -> 2-6 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,6,#} f locals=,2,6,#,4,5,6 +true h-2-7 -> 2-7 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,7,#} f locals=,2,7,#,4,5,6 +true h-1-3 -> 1-3 get=n,# set=n,nil get=n,# g locals=7,8,9 tbl={1,3,#} f locals=,1,3,#,4,5,6 +true h-1-4 -> 1-4 get=#,nil set=x1,nil get=x1,# g locals=7,8,9 tbl={1,4,#} f locals=,1,4,#,4,5,6 +true h-1-5 -> 1-5 get=nil,# set=y1,nil get=y1,# g locals=7,8,9 tbl={1,5,#} f locals=,1,5,#,4,5,6 +true h-1-6 -> 1-6 get=nil,nil set=nil,nil get=x2,nil g locals=7,8,9 tbl={1,6,#} f locals=,1,6,#,4,5,6 +true h-1-7 -> 1-7 get=nil,nil set=nil,nil get=y2,nil g locals=7,8,9 tbl={1,7,#} f locals=,1,7,#,4,5,6 +----- debug.getupvalue, debug.setupvalue +h 101 102 103 104 105 106 107 108 109 +f -> 1-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,101,102,103,104,105,106,107,108,109 +f -> 1-1 get=true,m,101 set=true,m,nil get=true,m,777001 tbl=true,777001,102,103,104,105,106,107,108,109 +f -> 1-2 get=true,n,102 set=true,n,nil get=true,n,777002 tbl=true,777001,777002,103,104,105,106,107,108,109 +f -> 1-3 get=true,o,103 set=true,o,nil get=true,o,777003 tbl=true,777001,777002,777003,104,105,106,107,108,109 +f -> 1-4 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +f -> 1-5 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +f -> 1-6 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +f -> 1-7 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +f -> 1-8 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +f -> 1-9 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +f -> 1-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +g -> 2-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +g -> 2-1 get=true,m,777001 set=true,m,nil get=true,m,888001 tbl=true,888001,777002,777003,104,105,106,107,108,109 +g -> 2-2 get=true,n,777002 set=true,n,nil get=true,n,888002 tbl=true,888001,888002,777003,104,105,106,107,108,109 +g -> 2-3 get=true,o,777003 set=true,o,nil get=true,o,888003 tbl=true,888001,888002,888003,104,105,106,107,108,109 +g -> 2-4 get=true,p,104 set=true,p,nil get=true,p,888004 tbl=true,888001,888002,888003,888004,105,106,107,108,109 +g -> 2-5 get=true,q,105 set=true,q,nil get=true,q,888005 tbl=true,888001,888002,888003,888004,888005,106,107,108,109 +g -> 2-6 get=true,r,106 set=true,r,nil get=true,r,888006 tbl=true,888001,888002,888003,888004,888005,888006,107,108,109 +g -> 2-7 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109 +g -> 2-8 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109 +g -> 2-9 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109 +g -> 2-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109 +h -> 3-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109 +h -> 3-1 get=true,m,888001 set=true,m,nil get=true,m,999001 tbl=true,999001,888002,888003,888004,888005,888006,107,108,109 +h -> 3-2 get=true,n,888002 set=true,n,nil get=true,n,999002 tbl=true,999001,999002,888003,888004,888005,888006,107,108,109 +h -> 3-3 get=true,o,888003 set=true,o,nil get=true,o,999003 tbl=true,999001,999002,999003,888004,888005,888006,107,108,109 +h -> 3-4 get=true,p,888004 set=true,p,nil get=true,p,999004 tbl=true,999001,999002,999003,999004,888005,888006,107,108,109 +h -> 3-5 get=true,q,888005 set=true,q,nil get=true,q,999005 tbl=true,999001,999002,999003,999004,999005,888006,107,108,109 +h -> 3-6 get=true,r,888006 set=true,r,nil get=true,r,999006 tbl=true,999001,999002,999003,999004,999005,999006,107,108,109 +h -> 3-7 get=true,v,107 set=true,v,nil get=true,v,999007 tbl=true,999001,999002,999003,999004,999005,999006,999007,108,109 +h -> 3-8 get=true,w,108 set=true,w,nil get=true,w,999008 tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,109 +h -> 3-9 get=true,x,109 set=true,x,nil get=true,x,999009 tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,999009 +h -> 3-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,999009 +----- debug.setmetatable, debug.getmetatable +a.a=bbb a.b=nil b.a=nil b.b=nil +a.a=bbb a.b=ccc b.a=nil b.b=nil +boolean table nil table +boolean nil nil nil +boolean table nil nil +a.a=bbb a.b=nil b.a=nil b.b=nil +boolean nil nil nil +get=true,true,nil +set=true,true,nil +get=true,true,nil +get=true,true,nil +set=true,true,nil +get=true,true,nil +true nil +true 1 +true 1 +----- debug.getinfo +6 +--- +debug.getinfo(1) + source: @debuglib.lua + short_src: debuglib.lua + what: Lua + currentline: 144 + linedefined: 141 + lastlinedefined: 155 + nups: 5 + func: function +debug.getinfo(1,"") +debug.getinfo(1,"l") + currentline: 146 +debug.getinfo(1,"fL") + func: function + activelines: {} +debug.getinfo(2) + source: @debuglib.lua + short_src: debuglib.lua + what: Lua + currentline: 157 + linedefined: 135 + lastlinedefined: 159 + nups: 6 + func: function +debug.getinfo(2,"l") + currentline: 157 +debug.getinfo(2,"fL") + func: function + activelines: {} +debug.getinfo(10,"") +true +debug.getinfo(-10,"") +true +--- +5 +e,f,g true function function +debug.getinfo(f) +true + source: @debuglib.lua + short_src: debuglib.lua + what: Lua + currentline: -1 + linedefined: 137 + lastlinedefined: 140 + nups: 1 + func: function +debug.getinfo(f,"nSlufL") +true + source: @debuglib.lua + short_src: debuglib.lua + what: Lua + currentline: -1 + linedefined: 137 + lastlinedefined: 140 + nups: 1 + func: function + activelines: {} +debug.getinfo(f,"n") +true +debug.getinfo(f,"S") +true + source: @debuglib.lua + short_src: debuglib.lua + what: Lua + linedefined: 137 + lastlinedefined: 140 +debug.getinfo(f,"l") +true + currentline: -1 +debug.getinfo(f,"u") +true + nups: 1 +debug.getinfo(f,"f") +true + func: function +debug.getinfo(f,"L") +true + activelines: {} +debug.getinfo(g) +true + source: @debuglib.lua + short_src: debuglib.lua + what: Lua + currentline: -1 + linedefined: 141 + lastlinedefined: 155 + nups: 5 + func: function +debug.getinfo(test) +true + source: @debuglib.lua + short_src: debuglib.lua + what: Lua + currentline: -1 + linedefined: 135 + lastlinedefined: 159 + nups: 6 + func: function +----- debug.sethook, debug.gethook + ... in hook call nil + info[2]=debuglib.lua,177 + ... in hook call nil + info[2]=debuglib.lua,176 + ... in hook call nil + info[2]=[C],-1 + ... in hook call nil + info[2]=[C],-1 +hook = c -> result=true,nil,nil,nil,false,false,nil + ... in hook return nil + info[2]=[C],-1 + ... in hook return nil + info[2]=[C],-1 +hook = r -> result=true,nil,nil,nil,false,false,nil + ... in hook line 192 + info[2]=debuglib.lua,192 + ... in hook line 177 + info[2]=debuglib.lua,177 + ... in hook line 178 + info[2]=debuglib.lua,178 + ... in hook line 176 + info[2]=debuglib.lua,176 + ... in hook line 195 + info[2]=debuglib.lua,195 +hook = l -> result=true,nil,nil,nil,false,false,nil + ... in hook return nil + info[2]=[C],-1 + ... in hook line 192 + info[2]=debuglib.lua,192 + ... in hook call nil + info[2]=debuglib.lua,177 + ... in hook line 177 + info[2]=debuglib.lua,177 + ... in hook line 178 + info[2]=debuglib.lua,178 + ... in hook call nil + info[2]=debuglib.lua,176 + ... in hook line 176 + info[2]=debuglib.lua,176 + ... in hook call nil + info[2]=[C],-1 + ... in hook return nil + info[2]=[C],-1 + ... in hook line 195 + info[2]=debuglib.lua,195 + ... in hook call nil + info[2]=[C],-1 +hook = crl -> result=true,nil,nil,nil,false,false,nil +----- debug.traceback +hi +stack traceback: + debuglib.lua:216: in function + [C]: in function 'pcall' + debuglib.lua:219: in function 'b' + debuglib.lua:222: in function 'c' + debuglib.lua:225: in function '__index' + debuglib.lua:227: in function 'e' + debuglib.lua:231: in function 'g' + debuglib.lua:235: in function 'i' + debuglib.lua:238: in function + [C]: in function 'pcall' + debuglib.lua:240: in main chunk + [C]: in ? +----- debug.upvalueid +debug.getupvalue(a1,1) x 100 +debug.getupvalue(a1,2) y 200 +debug.getupvalue(a2,1) x 100 +debug.getupvalue(a2,2) y 200 +debug.upvalueid(a1,1) == debug.upvalueid(a1,1) true +debug.upvalueid(a1,1) == debug.upvalueid(a2,1) true +debug.upvalueid(a1,1) == debug.upvalueid(a1,2) false +----- debug.upvaluejoin +a1 101 201 301 401 +a2 102 202 501 601 +debug.upvaluejoin(a1,1,a2,2) +debug.upvaluejoin(a1,3,a2,4) +a1 203 203 602 402 +a2 103 204 502 603 +a1 205 205 604 403 +a2 104 206 503 605 +debug.getupvalue(a1,1) x 206 +debug.getupvalue(a2,1) x 104 +debug.upvalueid(a1,1) == debug.upvalueid(a1,1) true +debug.upvalueid(a1,1) == debug.upvalueid(a2,1) false +debug.upvalueid(a2,1) == debug.upvalueid(a1,1) false +debug.upvalueid(a2,1) == debug.upvalueid(a2,1) true +debug.upvalueid(a1,1) == debug.upvalueid(a1,2) true +debug.upvalueid(a1,1) == debug.upvalueid(a2,2) true +debug.upvalueid(a2,1) == debug.upvalueid(a1,2) false +debug.upvalueid(a2,1) == debug.upvalueid(a2,2) false +debug.upvalueid(a1,1) == debug.upvalueid(a1,3) false +debug.upvalueid(a1,1) == debug.upvalueid(a2,3) false +debug.upvalueid(a2,1) == debug.upvalueid(a1,3) false +debug.upvalueid(a2,1) == debug.upvalueid(a2,3) false +debug.upvalueid(a1,1) == debug.upvalueid(a1,4) false +debug.upvalueid(a1,1) == debug.upvalueid(a2,4) false +debug.upvalueid(a2,1) == debug.upvalueid(a1,4) false +debug.upvalueid(a2,1) == debug.upvalueid(a2,4) false +debug.getupvalue(a1,2) y 206 +debug.getupvalue(a2,2) y 206 +debug.upvalueid(a1,2) == debug.upvalueid(a1,1) true +debug.upvalueid(a1,2) == debug.upvalueid(a2,1) false +debug.upvalueid(a2,2) == debug.upvalueid(a1,1) true +debug.upvalueid(a2,2) == debug.upvalueid(a2,1) false +debug.upvalueid(a1,2) == debug.upvalueid(a1,2) true +debug.upvalueid(a1,2) == debug.upvalueid(a2,2) true +debug.upvalueid(a2,2) == debug.upvalueid(a1,2) true +debug.upvalueid(a2,2) == debug.upvalueid(a2,2) true +debug.upvalueid(a1,2) == debug.upvalueid(a1,3) false +debug.upvalueid(a1,2) == debug.upvalueid(a2,3) false +debug.upvalueid(a2,2) == debug.upvalueid(a1,3) false +debug.upvalueid(a2,2) == debug.upvalueid(a2,3) false +debug.upvalueid(a1,2) == debug.upvalueid(a1,4) false +debug.upvalueid(a1,2) == debug.upvalueid(a2,4) false +debug.upvalueid(a2,2) == debug.upvalueid(a1,4) false +debug.upvalueid(a2,2) == debug.upvalueid(a2,4) false +debug.getupvalue(a1,3) z 605 +debug.getupvalue(a2,3) z 503 +debug.upvalueid(a1,3) == debug.upvalueid(a1,1) false +debug.upvalueid(a1,3) == debug.upvalueid(a2,1) false +debug.upvalueid(a2,3) == debug.upvalueid(a1,1) false +debug.upvalueid(a2,3) == debug.upvalueid(a2,1) false +debug.upvalueid(a1,3) == debug.upvalueid(a1,2) false +debug.upvalueid(a1,3) == debug.upvalueid(a2,2) false +debug.upvalueid(a2,3) == debug.upvalueid(a1,2) false +debug.upvalueid(a2,3) == debug.upvalueid(a2,2) false +debug.upvalueid(a1,3) == debug.upvalueid(a1,3) true +debug.upvalueid(a1,3) == debug.upvalueid(a2,3) false +debug.upvalueid(a2,3) == debug.upvalueid(a1,3) false +debug.upvalueid(a2,3) == debug.upvalueid(a2,3) true +debug.upvalueid(a1,3) == debug.upvalueid(a1,4) false +debug.upvalueid(a1,3) == debug.upvalueid(a2,4) true +debug.upvalueid(a2,3) == debug.upvalueid(a1,4) false +debug.upvalueid(a2,3) == debug.upvalueid(a2,4) false +debug.getupvalue(a1,4) w 403 +debug.getupvalue(a2,4) w 605 +debug.upvalueid(a1,4) == debug.upvalueid(a1,1) false +debug.upvalueid(a1,4) == debug.upvalueid(a2,1) false +debug.upvalueid(a2,4) == debug.upvalueid(a1,1) false +debug.upvalueid(a2,4) == debug.upvalueid(a2,1) false +debug.upvalueid(a1,4) == debug.upvalueid(a1,2) false +debug.upvalueid(a1,4) == debug.upvalueid(a2,2) false +debug.upvalueid(a2,4) == debug.upvalueid(a1,2) false +debug.upvalueid(a2,4) == debug.upvalueid(a2,2) false +debug.upvalueid(a1,4) == debug.upvalueid(a1,3) false +debug.upvalueid(a1,4) == debug.upvalueid(a2,3) false +debug.upvalueid(a2,4) == debug.upvalueid(a1,3) true +debug.upvalueid(a2,4) == debug.upvalueid(a2,3) false +debug.upvalueid(a1,4) == debug.upvalueid(a1,4) true +debug.upvalueid(a1,4) == debug.upvalueid(a2,4) false +debug.upvalueid(a2,4) == debug.upvalueid(a1,4) false +debug.upvalueid(a2,4) == debug.upvalueid(a2,4) true diff --git a/luaj-test/src/test/resources/errors.lua b/luaj-test/src/test/resources/compatibility/errors.lua similarity index 100% rename from luaj-test/src/test/resources/errors.lua rename to luaj-test/src/test/resources/compatibility/errors.lua diff --git a/luaj-test/src/test/resources/compatibility/errors.out b/luaj-test/src/test/resources/compatibility/errors.out new file mode 100644 index 00000000..cc674319 --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/errors.out @@ -0,0 +1,97 @@ +a(error) false nil +a(error,"msg") false string +a(error,"msg",0) false string +a(error,"msg",1) false string +a(error,"msg",2) false string +a(error,"msg",3) false string +a(error,"msg",4) false string +a(error,"msg",5) false string +a(error,"msg",6) false string +a(nil()) false string +a(t()) false string +a(s()) false string +a(true()) false string +a(nil+1) false string +a(a+1) false string +a(s+1) false string +a(true+1) false string +a(nil.x) false string +a(a.x) false string +a(s.x) true nil +a(true.x) false string +a(nil.x=5) false string +a(a.x=5) false string +a(s.x=5) false string +a(true.x=5) false string +a(#nil) false string +a(#t) true 0 +a(#s) true 11 +a(#a) false string +a(#true) false string +a(nil>1) false string +a(a>1) false string +a(s>1) false string +a(true>1) false string +a(-nil) false string +a(-a) false string +a(-s) false string +a(-true) false string +-------- string concatenation +"a".."b" true +"a"..nil false +nil.."b" false +"a"..{} false +{}.."b" false +"a"..2 true +2.."b" true +"a"..print false +print.."b" false +"a"..true false +true.."b" false +nil..true false +"a"..3.5 true +3.5.."b" true +-------- table concatenation +"a".."b" true +"a"..nil false +nil.."b" false +"a"..{} false +{}.."b" false +"a"..2 true +2.."b" true +"a"..print false +print.."b" false +"a"..true false +true.."b" false +nil..true false +"a"..3.5 true +3.5.."b" true +-------- pairs tests +a(pairs(nil)) false string +a(pairs(a)) false string +a(pairs(s)) false string +a(pairs(t)) true func.1 +a(pairs(true)) false string +-------- setmetatable tests +a(setmetatable(nil)) false string +a(setmetatable(a)) false string +a(setmetatable(s)) false string +a(setmetatable(true)) false string +a(setmetatable(t)) true tbl.2 +a(getmetatable(t)) true tbl.3 +a(setmetatable(t*)) true tbl.2 +a(getmetatable(t)) true tbl.4 +a(setmetatable(t)) false string +a(getmetatable(t)) true tbl.4 +a(setmetatable(t)) true tbl.5 +a(getmetatable(t)) true tbl.6 +a(setmetatable(t*)) true tbl.5 +a(getmetatable(t)) true some string +a(setmetatable(t)) false string +a(getmetatable(t)) true some string +a(setmetatable(t,nil)) false string +a(setmetatable(t)) false string +a(setmetatable({},"abc")) false string +error("msg","arg") false string +loadfile("bogus.txt") true nil +dofile("bogus.txt") false string diff --git a/luaj-test/src/test/resources/functions.lua b/luaj-test/src/test/resources/compatibility/functions.lua similarity index 100% rename from luaj-test/src/test/resources/functions.lua rename to luaj-test/src/test/resources/compatibility/functions.lua diff --git a/luaj-test/src/test/resources/compatibility/functions.out b/luaj-test/src/test/resources/compatibility/functions.out new file mode 100644 index 00000000..cdffa68a --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/functions.out @@ -0,0 +1,68 @@ +f0: +f0: +f0: +f0: +f0: +f1: nil +f1: a1/1 +f1: a1/2 +f1: a1/3 +f1: a1/4 +f2: nil nil +f2: a1/1 nil +f2: a1/2 a2/2 +f2: a1/3 a2/3 +f2: a1/4 a2/4 +f3: nil nil nil +f3: a1/1 nil nil +f3: a1/2 a2/2 nil +f3: a1/3 a2/3 a3/3 +f3: a1/4 a2/4 a3/4 +f4: nil nil nil nil +f4: a1/1 nil nil nil +f4: a1/2 a2/2 nil nil +f4: a1/3 a2/3 a3/3 nil +f4: a1/4 a2/4 a3/4 a4/4 +z0: nil +z2: c2.3/4 +z4: c4.1/4 +g0: nil nil nil nil (eol) +g2: b2.3/4 b2.4/4 nil nil (eol) +g4: b4.1/4 b4.2/4 b4.3/4 b4.4/4 (eol) +11 12 13 +23 22 21 +32 45 58 +a nil +... +...,a nil nil +a,... nil +a q +... +...,a nil q +a,... q +a q +... r +...,a r q +a,... q r +a q +... r s +...,a r q +a,... q r s +third abc nil | nil nil nil +third def nil | nil nil nil +third def nil | nil nil nil +third abc p | p nil nil +third def nil | p nil nil +third def nil | p nil nil +third abc p | p q nil +third def q | p q nil +third def q | p q nil +third abc p | p q r +third def q | p q r +third def q | p q r +third abc p | p q r +third def q | p q r +third def q | p q r +third abc nil | nil nil nil +third def nil | nil nil nil +third def nil | nil nil nil diff --git a/luaj-test/src/test/resources/iolib.lua b/luaj-test/src/test/resources/compatibility/iolib.lua similarity index 100% rename from luaj-test/src/test/resources/iolib.lua rename to luaj-test/src/test/resources/compatibility/iolib.lua diff --git a/luaj-test/src/test/resources/compatibility/iolib.out b/luaj-test/src/test/resources/compatibility/iolib.out new file mode 100644 index 00000000..a7b175be --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/iolib.out @@ -0,0 +1,96 @@ +true +true +true +true +true +write file.0 +Thiswrite file.0 + is a pen.write file.0 +flush true +f userdata +file.1 +write file.2 +type(f) file.1 +close true +type(f) closed file +type("f") nil +"abc" string +----- 1 +"def" string +----- 2 +"12345" number +----- 3 +"678910" number +----- 4 +" more\7aaaaaa\8bbbthe rest" string +----- 5 +h file.1 file.4 nil +write file.3 +close true +j file.1 +seek 3 +read def 123 +seek 2 +read cdef 12 +seek 1 +read bcde f 1 +seek(cur,0) 8 +seek(cur,20) 28 +seek(end,-5) 73 +read(4) "text" +read(4) "." +read(4) "nil" +close true +f.type file.5 +f file.6 +write file.6 +type(f) file.5 +close true +"line one" +"line two" +"" +"after blank line" +"unterminated line" +"line one" +"line two" +"" +"after blank line" +"unterminated line" +"line one" +"line two" +"" +"after blank line" +"unterminated line" +"line one" +"line two" +"" +"after blank line" +"unterminated line" +file.7 +file.7 +a:write file.8 +b:write file.9 +a:setvbuf true +a:setvbuf true +a:setvbuf true +a:write file.8 +b:write file.9 +a:flush true +b:flush true +a:close true +a:write false closed +a:flush false closed +a:read false closed +a:lines false closed +a:seek false closed +a:setvbuf false closed +a:close false closed +io.type(a) true +io.close() true +io.close(io.output()) true +io.close() true +io.write false closed +io.flush false closed +io.close false closed +io.read false closed +io.lines false closed diff --git a/luaj-test/src/test/resources/compatibility/luajit/debuglib.out b/luaj-test/src/test/resources/compatibility/luajit/debuglib.out new file mode 100644 index 00000000..e03e8d18 --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/luajit/debuglib.out @@ -0,0 +1,321 @@ +has debug true +----- debug.getlocal, debug.setlocal +true h-3-0 -> 3-0 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={3,0,#} f locals=,3,0,#,4,5,6 +true h-3-1 -> 3-1 get=a,3 set=a,nil get=a,# g locals=7,8,9 tbl={3,1,#} f locals=,#,1,#,4,5,6 +true h-3-2 -> 3-2 get=b,2 set=b,nil get=b,# g locals=7,8,9 tbl={3,2,#} f locals=,3,#,#,4,5,6 +true h-3-3 -> 3-3 get=c,# set=c,nil get=c,# g locals=7,8,9 tbl={3,3,#} f locals=,3,3,#,4,5,6 +true h-3-4 -> 3-4 get=d,4 set=d,nil get=d,# g locals=7,8,9 tbl={3,4,#} f locals=,3,4,#,#,5,6 +true h-3-5 -> 3-5 get=e,5 set=e,nil get=e,# g locals=7,8,9 tbl={3,5,#} f locals=,3,5,#,4,#,6 +true h-3-6 -> 3-6 get=f,6 set=f,nil get=f,# g locals=7,8,9 tbl={3,6,#} f locals=,3,6,#,4,5,# +true h-3-7 -> 3-7 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={3,7,#} f locals=,3,7,#,4,5,6 +true h-2-0 -> 2-0 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,0,#} f locals=,2,0,#,4,5,6 +true h-2-1 -> 2-1 get=p,7 set=p,nil get=p,# g locals=#,8,9 tbl={2,1,#} f locals=,2,1,#,4,5,6 +true h-2-2 -> 2-2 get=q,8 set=q,nil get=q,# g locals=7,#,9 tbl={2,2,#} f locals=,2,2,#,4,5,6 +true h-2-3 -> 2-3 get=r,9 set=r,nil get=r,# g locals=7,8,# tbl={2,3,#} f locals=,2,3,#,4,5,6 +true h-2-4 -> 2-4 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,4,#} f locals=,2,4,#,4,5,6 +true h-2-5 -> 2-5 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,5,#} f locals=,2,5,#,4,5,6 +true h-2-6 -> 2-6 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,6,#} f locals=,2,6,#,4,5,6 +true h-2-7 -> 2-7 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,7,#} f locals=,2,7,#,4,5,6 +true h-1-3 -> 1-3 get=n,# set=n,nil get=n,# g locals=7,8,9 tbl={1,3,#} f locals=,1,3,#,4,5,6 +true h-1-4 -> 1-4 get=#,nil set=x1,nil get=x1,# g locals=7,8,9 tbl={1,4,#} f locals=,1,4,#,4,5,6 +true h-1-5 -> 1-5 get=nil,# set=y1,nil get=y1,# g locals=7,8,9 tbl={1,5,#} f locals=,1,5,#,4,5,6 +true h-1-6 -> 1-6 get=nil,nil set=nil,nil get=x2,nil g locals=7,8,9 tbl={1,6,#} f locals=,1,6,#,4,5,6 +true h-1-7 -> 1-7 get=nil,nil set=nil,nil get=y2,nil g locals=7,8,9 tbl={1,7,#} f locals=,1,7,#,4,5,6 +----- debug.getupvalue, debug.setupvalue +h 101 102 103 104 105 106 107 108 109 +f -> 1-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,101,102,103,104,105,106,107,108,109 +f -> 1-1 get=true,m,101 set=true,m,nil get=true,m,777001 tbl=true,777001,102,103,104,105,106,107,108,109 +f -> 1-2 get=true,n,102 set=true,n,nil get=true,n,777002 tbl=true,777001,777002,103,104,105,106,107,108,109 +f -> 1-3 get=true,o,103 set=true,o,nil get=true,o,777003 tbl=true,777001,777002,777003,104,105,106,107,108,109 +f -> 1-4 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +f -> 1-5 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +f -> 1-6 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +f -> 1-7 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +f -> 1-8 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +f -> 1-9 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +f -> 1-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +g -> 2-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109 +g -> 2-1 get=true,m,777001 set=true,m,nil get=true,m,888001 tbl=true,888001,777002,777003,104,105,106,107,108,109 +g -> 2-2 get=true,n,777002 set=true,n,nil get=true,n,888002 tbl=true,888001,888002,777003,104,105,106,107,108,109 +g -> 2-3 get=true,o,777003 set=true,o,nil get=true,o,888003 tbl=true,888001,888002,888003,104,105,106,107,108,109 +g -> 2-4 get=true,p,104 set=true,p,nil get=true,p,888004 tbl=true,888001,888002,888003,888004,105,106,107,108,109 +g -> 2-5 get=true,q,105 set=true,q,nil get=true,q,888005 tbl=true,888001,888002,888003,888004,888005,106,107,108,109 +g -> 2-6 get=true,r,106 set=true,r,nil get=true,r,888006 tbl=true,888001,888002,888003,888004,888005,888006,107,108,109 +g -> 2-7 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109 +g -> 2-8 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109 +g -> 2-9 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109 +g -> 2-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109 +h -> 3-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109 +h -> 3-1 get=true,m,888001 set=true,m,nil get=true,m,999001 tbl=true,999001,888002,888003,888004,888005,888006,107,108,109 +h -> 3-2 get=true,n,888002 set=true,n,nil get=true,n,999002 tbl=true,999001,999002,888003,888004,888005,888006,107,108,109 +h -> 3-3 get=true,o,888003 set=true,o,nil get=true,o,999003 tbl=true,999001,999002,999003,888004,888005,888006,107,108,109 +h -> 3-4 get=true,p,888004 set=true,p,nil get=true,p,999004 tbl=true,999001,999002,999003,999004,888005,888006,107,108,109 +h -> 3-5 get=true,q,888005 set=true,q,nil get=true,q,999005 tbl=true,999001,999002,999003,999004,999005,888006,107,108,109 +h -> 3-6 get=true,r,888006 set=true,r,nil get=true,r,999006 tbl=true,999001,999002,999003,999004,999005,999006,107,108,109 +h -> 3-7 get=true,v,107 set=true,v,nil get=true,v,999007 tbl=true,999001,999002,999003,999004,999005,999006,999007,108,109 +h -> 3-8 get=true,w,108 set=true,w,nil get=true,w,999008 tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,109 +h -> 3-9 get=true,x,109 set=true,x,nil get=true,x,999009 tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,999009 +h -> 3-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,999009 +----- debug.setmetatable, debug.getmetatable +a.a=bbb a.b=nil b.a=nil b.b=nil +a.a=bbb a.b=ccc b.a=nil b.b=nil +boolean table nil table +boolean nil nil nil +boolean boolean nil nil +a.a=bbb a.b=nil b.a=nil b.b=nil +boolean nil nil nil +get=true,true,nil +set=true,false,nil +get=true,true,nil +get=true,true,nil +set=true,false,nil +get=true,true,nil +true nil +true true +true true +----- debug.getinfo +6 +--- +debug.getinfo(1) + source: @debuglib.lua + short_src: debuglib.lua + what: Lua + currentline: 144 + linedefined: 141 + lastlinedefined: 155 + nups: 4 + func: function +debug.getinfo(1,"") +debug.getinfo(1,"l") + currentline: 146 +debug.getinfo(1,"fL") + func: function + activelines: {} +debug.getinfo(2) + source: @debuglib.lua + short_src: debuglib.lua + what: Lua + currentline: 157 + linedefined: 135 + lastlinedefined: 159 + nups: 5 + func: function +debug.getinfo(2,"l") + currentline: 157 +debug.getinfo(2,"fL") + func: function + activelines: {} +debug.getinfo(10,"") +true +debug.getinfo(-10,"") +true +--- +5 +e,f,g true function function +debug.getinfo(f) +true + source: @debuglib.lua + short_src: debuglib.lua + what: Lua + currentline: -1 + linedefined: 137 + lastlinedefined: 140 + nups: 1 + func: function +debug.getinfo(f,"nSlufL") +true + source: @debuglib.lua + short_src: debuglib.lua + what: Lua + currentline: -1 + linedefined: 137 + lastlinedefined: 140 + nups: 1 + func: function + activelines: {} +debug.getinfo(f,"n") +true +debug.getinfo(f,"S") +true + source: @debuglib.lua + short_src: debuglib.lua + what: Lua + linedefined: 137 + lastlinedefined: 140 +debug.getinfo(f,"l") +true + currentline: -1 +debug.getinfo(f,"u") +true + nups: 1 +debug.getinfo(f,"f") +true + func: function +debug.getinfo(f,"L") +true + activelines: {} +debug.getinfo(g) +true + source: @debuglib.lua + short_src: debuglib.lua + what: Lua + currentline: -1 + linedefined: 141 + lastlinedefined: 155 + nups: 4 + func: function +debug.getinfo(test) +true + source: @debuglib.lua + short_src: debuglib.lua + what: Lua + currentline: -1 + linedefined: 135 + lastlinedefined: 159 + nups: 5 + func: function +----- debug.sethook, debug.gethook + ... in hook call nil + info[2]=debuglib.lua,174 + ... in hook call nil + info[2]=debuglib.lua,175 + ... in hook call nil + info[2]=[C],-1 + ... in hook call nil + info[2]=[C],-1 +hook = c -> result=true,nil,nil,nil,false,false,nil +hook = r -> result=true,nil,nil,nil,false,false,nil + ... in hook line 192 + info[2]=debuglib.lua,192 + ... in hook line 177 + info[2]=debuglib.lua,177 + ... in hook line 178 + info[2]=debuglib.lua,178 + ... in hook line 176 + info[2]=debuglib.lua,176 + ... in hook line 195 + info[2]=debuglib.lua,195 +hook = l -> result=true,nil,nil,nil,false,false,nil + ... in hook line 192 + info[2]=debuglib.lua,192 + ... in hook call nil + info[2]=debuglib.lua,174 + ... in hook line 177 + info[2]=debuglib.lua,177 + ... in hook line 178 + info[2]=debuglib.lua,178 + ... in hook call nil + info[2]=debuglib.lua,175 + ... in hook line 176 + info[2]=debuglib.lua,176 + ... in hook call nil + info[2]=[C],-1 + ... in hook line 195 + info[2]=debuglib.lua,195 + ... in hook call nil + info[2]=[C],-1 +hook = crl -> result=true,nil,nil,nil,false,false,nil +----- debug.traceback +hi +stack traceback: + debuglib.lua:216: in function + [C]: in function 'pcall' + debuglib.lua:219: in function 'b' + debuglib.lua:222: in function 'c' + debuglib.lua:225: in function '__index' + debuglib.lua:227: in function 'e' + debuglib.lua:231: in function 'g' + debuglib.lua:235: in function 'i' + debuglib.lua:238: in function + [C]: in function 'pcall' + debuglib.lua:240: in main chunk + [C]: at 0x55eaaf4e2f20 +----- debug.upvalueid +debug.getupvalue(a1,1) x 100 +debug.getupvalue(a1,2) y 200 +debug.getupvalue(a2,1) x 100 +debug.getupvalue(a2,2) y 200 +debug.upvalueid(a1,1) == debug.upvalueid(a1,1) true +debug.upvalueid(a1,1) == debug.upvalueid(a2,1) true +debug.upvalueid(a1,1) == debug.upvalueid(a1,2) false +----- debug.upvaluejoin +a1 101 201 301 401 +a2 102 202 501 601 +debug.upvaluejoin(a1,1,a2,2) +debug.upvaluejoin(a1,3,a2,4) +a1 203 203 602 402 +a2 103 204 502 603 +a1 205 205 604 403 +a2 104 206 503 605 +debug.getupvalue(a1,1) x 206 +debug.getupvalue(a2,1) x 104 +debug.upvalueid(a1,1) == debug.upvalueid(a1,1) true +debug.upvalueid(a1,1) == debug.upvalueid(a2,1) false +debug.upvalueid(a2,1) == debug.upvalueid(a1,1) false +debug.upvalueid(a2,1) == debug.upvalueid(a2,1) true +debug.upvalueid(a1,1) == debug.upvalueid(a1,2) true +debug.upvalueid(a1,1) == debug.upvalueid(a2,2) true +debug.upvalueid(a2,1) == debug.upvalueid(a1,2) false +debug.upvalueid(a2,1) == debug.upvalueid(a2,2) false +debug.upvalueid(a1,1) == debug.upvalueid(a1,3) false +debug.upvalueid(a1,1) == debug.upvalueid(a2,3) false +debug.upvalueid(a2,1) == debug.upvalueid(a1,3) false +debug.upvalueid(a2,1) == debug.upvalueid(a2,3) false +debug.upvalueid(a1,1) == debug.upvalueid(a1,4) false +debug.upvalueid(a1,1) == debug.upvalueid(a2,4) false +debug.upvalueid(a2,1) == debug.upvalueid(a1,4) false +debug.upvalueid(a2,1) == debug.upvalueid(a2,4) false +debug.getupvalue(a1,2) y 206 +debug.getupvalue(a2,2) y 206 +debug.upvalueid(a1,2) == debug.upvalueid(a1,1) true +debug.upvalueid(a1,2) == debug.upvalueid(a2,1) false +debug.upvalueid(a2,2) == debug.upvalueid(a1,1) true +debug.upvalueid(a2,2) == debug.upvalueid(a2,1) false +debug.upvalueid(a1,2) == debug.upvalueid(a1,2) true +debug.upvalueid(a1,2) == debug.upvalueid(a2,2) true +debug.upvalueid(a2,2) == debug.upvalueid(a1,2) true +debug.upvalueid(a2,2) == debug.upvalueid(a2,2) true +debug.upvalueid(a1,2) == debug.upvalueid(a1,3) false +debug.upvalueid(a1,2) == debug.upvalueid(a2,3) false +debug.upvalueid(a2,2) == debug.upvalueid(a1,3) false +debug.upvalueid(a2,2) == debug.upvalueid(a2,3) false +debug.upvalueid(a1,2) == debug.upvalueid(a1,4) false +debug.upvalueid(a1,2) == debug.upvalueid(a2,4) false +debug.upvalueid(a2,2) == debug.upvalueid(a1,4) false +debug.upvalueid(a2,2) == debug.upvalueid(a2,4) false +debug.getupvalue(a1,3) z 605 +debug.getupvalue(a2,3) z 503 +debug.upvalueid(a1,3) == debug.upvalueid(a1,1) false +debug.upvalueid(a1,3) == debug.upvalueid(a2,1) false +debug.upvalueid(a2,3) == debug.upvalueid(a1,1) false +debug.upvalueid(a2,3) == debug.upvalueid(a2,1) false +debug.upvalueid(a1,3) == debug.upvalueid(a1,2) false +debug.upvalueid(a1,3) == debug.upvalueid(a2,2) false +debug.upvalueid(a2,3) == debug.upvalueid(a1,2) false +debug.upvalueid(a2,3) == debug.upvalueid(a2,2) false +debug.upvalueid(a1,3) == debug.upvalueid(a1,3) true +debug.upvalueid(a1,3) == debug.upvalueid(a2,3) false +debug.upvalueid(a2,3) == debug.upvalueid(a1,3) false +debug.upvalueid(a2,3) == debug.upvalueid(a2,3) true +debug.upvalueid(a1,3) == debug.upvalueid(a1,4) false +debug.upvalueid(a1,3) == debug.upvalueid(a2,4) true +debug.upvalueid(a2,3) == debug.upvalueid(a1,4) false +debug.upvalueid(a2,3) == debug.upvalueid(a2,4) false +debug.getupvalue(a1,4) w 403 +debug.getupvalue(a2,4) w 605 +debug.upvalueid(a1,4) == debug.upvalueid(a1,1) false +debug.upvalueid(a1,4) == debug.upvalueid(a2,1) false +debug.upvalueid(a2,4) == debug.upvalueid(a1,1) false +debug.upvalueid(a2,4) == debug.upvalueid(a2,1) false +debug.upvalueid(a1,4) == debug.upvalueid(a1,2) false +debug.upvalueid(a1,4) == debug.upvalueid(a2,2) false +debug.upvalueid(a2,4) == debug.upvalueid(a1,2) false +debug.upvalueid(a2,4) == debug.upvalueid(a2,2) false +debug.upvalueid(a1,4) == debug.upvalueid(a1,3) false +debug.upvalueid(a1,4) == debug.upvalueid(a2,3) false +debug.upvalueid(a2,4) == debug.upvalueid(a1,3) true +debug.upvalueid(a2,4) == debug.upvalueid(a2,3) false +debug.upvalueid(a1,4) == debug.upvalueid(a1,4) true +debug.upvalueid(a1,4) == debug.upvalueid(a2,4) false +debug.upvalueid(a2,4) == debug.upvalueid(a1,4) false +debug.upvalueid(a2,4) == debug.upvalueid(a2,4) true diff --git a/luaj-test/src/test/resources/manyupvals.lua b/luaj-test/src/test/resources/compatibility/manyupvals.lua similarity index 100% rename from luaj-test/src/test/resources/manyupvals.lua rename to luaj-test/src/test/resources/compatibility/manyupvals.lua diff --git a/luaj-test/src/test/resources/compatibility/manyupvals.out b/luaj-test/src/test/resources/compatibility/manyupvals.out new file mode 100644 index 00000000..391387a3 --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/manyupvals.out @@ -0,0 +1,1981 @@ + local f1 + f1 = function() return 1 end + local f2 + f2 = function() return 1 end + local f3 + do + local result + function f3() + if not result then + result = f1() + f2() + end + return result + end + end + local f4 + do + local result + function f4() + if not result then + result = f2() + f3() + end + return result + end + end + local f5 + do + local result + function f5() + if not result then + result = f3() + f4() + end + return result + end + end + local f6 + do + local result + function f6() + if not result then + result = f4() + f5() + end + return result + end + end + local f7 + do + local result + function f7() + if not result then + result = f5() + f6() + end + return result + end + end + local f8 + do + local result + function f8() + if not result then + result = f6() + f7() + end + return result + end + end + local f9 + do + local result + function f9() + if not result then + result = f7() + f8() + end + return result + end + end + local f10 + do + local result + function f10() + if not result then + result = f8() + f9() + end + return result + end + end + local f11 + do + local result + function f11() + if not result then + result = f9() + f10() + end + return result + end + end + local f12 + do + local result + function f12() + if not result then + result = f10() + f11() + end + return result + end + end + local f13 + do + local result + function f13() + if not result then + result = f11() + f12() + end + return result + end + end + local f14 + do + local result + function f14() + if not result then + result = f12() + f13() + end + return result + end + end + local f15 + do + local result + function f15() + if not result then + result = f13() + f14() + end + return result + end + end + local f16 + do + local result + function f16() + if not result then + result = f14() + f15() + end + return result + end + end + local f17 + do + local result + function f17() + if not result then + result = f15() + f16() + end + return result + end + end + local f18 + do + local result + function f18() + if not result then + result = f16() + f17() + end + return result + end + end + local f19 + do + local result + function f19() + if not result then + result = f17() + f18() + end + return result + end + end + local f20 + do + local result + function f20() + if not result then + result = f18() + f19() + end + return result + end + end + local f21 + do + local result + function f21() + if not result then + result = f19() + f20() + end + return result + end + end + local f22 + do + local result + function f22() + if not result then + result = f20() + f21() + end + return result + end + end + local f23 + do + local result + function f23() + if not result then + result = f21() + f22() + end + return result + end + end + local f24 + do + local result + function f24() + if not result then + result = f22() + f23() + end + return result + end + end + local f25 + do + local result + function f25() + if not result then + result = f23() + f24() + end + return result + end + end + local f26 + do + local result + function f26() + if not result then + result = f24() + f25() + end + return result + end + end + local f27 + do + local result + function f27() + if not result then + result = f25() + f26() + end + return result + end + end + local f28 + do + local result + function f28() + if not result then + result = f26() + f27() + end + return result + end + end + local f29 + do + local result + function f29() + if not result then + result = f27() + f28() + end + return result + end + end + local f30 + do + local result + function f30() + if not result then + result = f28() + f29() + end + return result + end + end + local f31 + do + local result + function f31() + if not result then + result = f29() + f30() + end + return result + end + end + local f32 + do + local result + function f32() + if not result then + result = f30() + f31() + end + return result + end + end + local f33 + do + local result + function f33() + if not result then + result = f31() + f32() + end + return result + end + end + local f34 + do + local result + function f34() + if not result then + result = f32() + f33() + end + return result + end + end + local f35 + do + local result + function f35() + if not result then + result = f33() + f34() + end + return result + end + end + local f36 + do + local result + function f36() + if not result then + result = f34() + f35() + end + return result + end + end + local f37 + do + local result + function f37() + if not result then + result = f35() + f36() + end + return result + end + end + local f38 + do + local result + function f38() + if not result then + result = f36() + f37() + end + return result + end + end + local f39 + do + local result + function f39() + if not result then + result = f37() + f38() + end + return result + end + end + local f40 + do + local result + function f40() + if not result then + result = f38() + f39() + end + return result + end + end + local f41 + do + local result + function f41() + if not result then + result = f39() + f40() + end + return result + end + end + local f42 + do + local result + function f42() + if not result then + result = f40() + f41() + end + return result + end + end + local f43 + do + local result + function f43() + if not result then + result = f41() + f42() + end + return result + end + end + local f44 + do + local result + function f44() + if not result then + result = f42() + f43() + end + return result + end + end + local f45 + do + local result + function f45() + if not result then + result = f43() + f44() + end + return result + end + end + local f46 + do + local result + function f46() + if not result then + result = f44() + f45() + end + return result + end + end + local f47 + do + local result + function f47() + if not result then + result = f45() + f46() + end + return result + end + end + local f48 + do + local result + function f48() + if not result then + result = f46() + f47() + end + return result + end + end + local f49 + do + local result + function f49() + if not result then + result = f47() + f48() + end + return result + end + end + local f50 + do + local result + function f50() + if not result then + result = f48() + f49() + end + return result + end + end + local f51 + do + local result + function f51() + if not result then + result = f49() + f50() + end + return result + end + end + local f52 + do + local result + function f52() + if not result then + result = f50() + f51() + end + return result + end + end + local f53 + do + local result + function f53() + if not result then + result = f51() + f52() + end + return result + end + end + local f54 + do + local result + function f54() + if not result then + result = f52() + f53() + end + return result + end + end + local f55 + do + local result + function f55() + if not result then + result = f53() + f54() + end + return result + end + end + local f56 + do + local result + function f56() + if not result then + result = f54() + f55() + end + return result + end + end + local f57 + do + local result + function f57() + if not result then + result = f55() + f56() + end + return result + end + end + local f58 + do + local result + function f58() + if not result then + result = f56() + f57() + end + return result + end + end + local f59 + do + local result + function f59() + if not result then + result = f57() + f58() + end + return result + end + end + local f60 + do + local result + function f60() + if not result then + result = f58() + f59() + end + return result + end + end + local f61 + do + local result + function f61() + if not result then + result = f59() + f60() + end + return result + end + end + local f62 + do + local result + function f62() + if not result then + result = f60() + f61() + end + return result + end + end + local f63 + do + local result + function f63() + if not result then + result = f61() + f62() + end + return result + end + end + local f64 + do + local result + function f64() + if not result then + result = f62() + f63() + end + return result + end + end + local f65 + do + local result + function f65() + if not result then + result = f63() + f64() + end + return result + end + end + local f66 + do + local result + function f66() + if not result then + result = f64() + f65() + end + return result + end + end + local f67 + do + local result + function f67() + if not result then + result = f65() + f66() + end + return result + end + end + local f68 + do + local result + function f68() + if not result then + result = f66() + f67() + end + return result + end + end + local f69 + do + local result + function f69() + if not result then + result = f67() + f68() + end + return result + end + end + local f70 + do + local result + function f70() + if not result then + result = f68() + f69() + end + return result + end + end + local f71 + do + local result + function f71() + if not result then + result = f69() + f70() + end + return result + end + end + local f72 + do + local result + function f72() + if not result then + result = f70() + f71() + end + return result + end + end + local f73 + do + local result + function f73() + if not result then + result = f71() + f72() + end + return result + end + end + local f74 + do + local result + function f74() + if not result then + result = f72() + f73() + end + return result + end + end + local f75 + do + local result + function f75() + if not result then + result = f73() + f74() + end + return result + end + end + local f76 + do + local result + function f76() + if not result then + result = f74() + f75() + end + return result + end + end + local f77 + do + local result + function f77() + if not result then + result = f75() + f76() + end + return result + end + end + local f78 + do + local result + function f78() + if not result then + result = f76() + f77() + end + return result + end + end + local f79 + do + local result + function f79() + if not result then + result = f77() + f78() + end + return result + end + end + local f80 + do + local result + function f80() + if not result then + result = f78() + f79() + end + return result + end + end + local f81 + do + local result + function f81() + if not result then + result = f79() + f80() + end + return result + end + end + local f82 + do + local result + function f82() + if not result then + result = f80() + f81() + end + return result + end + end + local f83 + do + local result + function f83() + if not result then + result = f81() + f82() + end + return result + end + end + local f84 + do + local result + function f84() + if not result then + result = f82() + f83() + end + return result + end + end + local f85 + do + local result + function f85() + if not result then + result = f83() + f84() + end + return result + end + end + local f86 + do + local result + function f86() + if not result then + result = f84() + f85() + end + return result + end + end + local f87 + do + local result + function f87() + if not result then + result = f85() + f86() + end + return result + end + end + local f88 + do + local result + function f88() + if not result then + result = f86() + f87() + end + return result + end + end + local f89 + do + local result + function f89() + if not result then + result = f87() + f88() + end + return result + end + end + local f90 + do + local result + function f90() + if not result then + result = f88() + f89() + end + return result + end + end + local f91 + do + local result + function f91() + if not result then + result = f89() + f90() + end + return result + end + end + local f92 + do + local result + function f92() + if not result then + result = f90() + f91() + end + return result + end + end + local f93 + do + local result + function f93() + if not result then + result = f91() + f92() + end + return result + end + end + local f94 + do + local result + function f94() + if not result then + result = f92() + f93() + end + return result + end + end + local f95 + do + local result + function f95() + if not result then + result = f93() + f94() + end + return result + end + end + local f96 + do + local result + function f96() + if not result then + result = f94() + f95() + end + return result + end + end + local f97 + do + local result + function f97() + if not result then + result = f95() + f96() + end + return result + end + end + local f98 + do + local result + function f98() + if not result then + result = f96() + f97() + end + return result + end + end + local f99 + do + local result + function f99() + if not result then + result = f97() + f98() + end + return result + end + end + local f100 + do + local result + function f100() + if not result then + result = f98() + f99() + end + return result + end + end + local f101 + do + local result + function f101() + if not result then + result = f99() + f100() + end + return result + end + end + local f102 + do + local result + function f102() + if not result then + result = f100() + f101() + end + return result + end + end + local f103 + do + local result + function f103() + if not result then + result = f101() + f102() + end + return result + end + end + local f104 + do + local result + function f104() + if not result then + result = f102() + f103() + end + return result + end + end + local f105 + do + local result + function f105() + if not result then + result = f103() + f104() + end + return result + end + end + local f106 + do + local result + function f106() + if not result then + result = f104() + f105() + end + return result + end + end + local f107 + do + local result + function f107() + if not result then + result = f105() + f106() + end + return result + end + end + local f108 + do + local result + function f108() + if not result then + result = f106() + f107() + end + return result + end + end + local f109 + do + local result + function f109() + if not result then + result = f107() + f108() + end + return result + end + end + local f110 + do + local result + function f110() + if not result then + result = f108() + f109() + end + return result + end + end + local f111 + do + local result + function f111() + if not result then + result = f109() + f110() + end + return result + end + end + local f112 + do + local result + function f112() + if not result then + result = f110() + f111() + end + return result + end + end + local f113 + do + local result + function f113() + if not result then + result = f111() + f112() + end + return result + end + end + local f114 + do + local result + function f114() + if not result then + result = f112() + f113() + end + return result + end + end + local f115 + do + local result + function f115() + if not result then + result = f113() + f114() + end + return result + end + end + local f116 + do + local result + function f116() + if not result then + result = f114() + f115() + end + return result + end + end + local f117 + do + local result + function f117() + if not result then + result = f115() + f116() + end + return result + end + end + local f118 + do + local result + function f118() + if not result then + result = f116() + f117() + end + return result + end + end + local f119 + do + local result + function f119() + if not result then + result = f117() + f118() + end + return result + end + end + local f120 + do + local result + function f120() + if not result then + result = f118() + f119() + end + return result + end + end + local f121 + do + local result + function f121() + if not result then + result = f119() + f120() + end + return result + end + end + local f122 + do + local result + function f122() + if not result then + result = f120() + f121() + end + return result + end + end + local f123 + do + local result + function f123() + if not result then + result = f121() + f122() + end + return result + end + end + local f124 + do + local result + function f124() + if not result then + result = f122() + f123() + end + return result + end + end + local f125 + do + local result + function f125() + if not result then + result = f123() + f124() + end + return result + end + end + local f126 + do + local result + function f126() + if not result then + result = f124() + f125() + end + return result + end + end + local f127 + do + local result + function f127() + if not result then + result = f125() + f126() + end + return result + end + end + local f128 + do + local result + function f128() + if not result then + result = f126() + f127() + end + return result + end + end + local f129 + do + local result + function f129() + if not result then + result = f127() + f128() + end + return result + end + end + local f130 + do + local result + function f130() + if not result then + result = f128() + f129() + end + return result + end + end + local f131 + do + local result + function f131() + if not result then + result = f129() + f130() + end + return result + end + end + local f132 + do + local result + function f132() + if not result then + result = f130() + f131() + end + return result + end + end + local f133 + do + local result + function f133() + if not result then + result = f131() + f132() + end + return result + end + end + local f134 + do + local result + function f134() + if not result then + result = f132() + f133() + end + return result + end + end + local f135 + do + local result + function f135() + if not result then + result = f133() + f134() + end + return result + end + end + local f136 + do + local result + function f136() + if not result then + result = f134() + f135() + end + return result + end + end + local f137 + do + local result + function f137() + if not result then + result = f135() + f136() + end + return result + end + end + local f138 + do + local result + function f138() + if not result then + result = f136() + f137() + end + return result + end + end + local f139 + do + local result + function f139() + if not result then + result = f137() + f138() + end + return result + end + end + local f140 + do + local result + function f140() + if not result then + result = f138() + f139() + end + return result + end + end + local f141 + do + local result + function f141() + if not result then + result = f139() + f140() + end + return result + end + end + local f142 + do + local result + function f142() + if not result then + result = f140() + f141() + end + return result + end + end + local f143 + do + local result + function f143() + if not result then + result = f141() + f142() + end + return result + end + end + local f144 + do + local result + function f144() + if not result then + result = f142() + f143() + end + return result + end + end + local f145 + do + local result + function f145() + if not result then + result = f143() + f144() + end + return result + end + end + local f146 + do + local result + function f146() + if not result then + result = f144() + f145() + end + return result + end + end + local f147 + do + local result + function f147() + if not result then + result = f145() + f146() + end + return result + end + end + local f148 + do + local result + function f148() + if not result then + result = f146() + f147() + end + return result + end + end + local f149 + do + local result + function f149() + if not result then + result = f147() + f148() + end + return result + end + end + local f150 + do + local result + function f150() + if not result then + result = f148() + f149() + end + return result + end + end + local f151 + do + local result + function f151() + if not result then + result = f149() + f150() + end + return result + end + end + local f152 + do + local result + function f152() + if not result then + result = f150() + f151() + end + return result + end + end + local f153 + do + local result + function f153() + if not result then + result = f151() + f152() + end + return result + end + end + local f154 + do + local result + function f154() + if not result then + result = f152() + f153() + end + return result + end + end + local f155 + do + local result + function f155() + if not result then + result = f153() + f154() + end + return result + end + end + local f156 + do + local result + function f156() + if not result then + result = f154() + f155() + end + return result + end + end + local f157 + do + local result + function f157() + if not result then + result = f155() + f156() + end + return result + end + end + local f158 + do + local result + function f158() + if not result then + result = f156() + f157() + end + return result + end + end + local f159 + do + local result + function f159() + if not result then + result = f157() + f158() + end + return result + end + end + local f160 + do + local result + function f160() + if not result then + result = f158() + f159() + end + return result + end + end + local f161 + do + local result + function f161() + if not result then + result = f159() + f160() + end + return result + end + end + local f162 + do + local result + function f162() + if not result then + result = f160() + f161() + end + return result + end + end + local f163 + do + local result + function f163() + if not result then + result = f161() + f162() + end + return result + end + end + local f164 + do + local result + function f164() + if not result then + result = f162() + f163() + end + return result + end + end + local f165 + do + local result + function f165() + if not result then + result = f163() + f164() + end + return result + end + end + local f166 + do + local result + function f166() + if not result then + result = f164() + f165() + end + return result + end + end + local f167 + do + local result + function f167() + if not result then + result = f165() + f166() + end + return result + end + end + local f168 + do + local result + function f168() + if not result then + result = f166() + f167() + end + return result + end + end + local f169 + do + local result + function f169() + if not result then + result = f167() + f168() + end + return result + end + end + local f170 + do + local result + function f170() + if not result then + result = f168() + f169() + end + return result + end + end + local f171 + do + local result + function f171() + if not result then + result = f169() + f170() + end + return result + end + end + local f172 + do + local result + function f172() + if not result then + result = f170() + f171() + end + return result + end + end + local f173 + do + local result + function f173() + if not result then + result = f171() + f172() + end + return result + end + end + local f174 + do + local result + function f174() + if not result then + result = f172() + f173() + end + return result + end + end + local f175 + do + local result + function f175() + if not result then + result = f173() + f174() + end + return result + end + end + local f176 + do + local result + function f176() + if not result then + result = f174() + f175() + end + return result + end + end + local f177 + do + local result + function f177() + if not result then + result = f175() + f176() + end + return result + end + end + local f178 + do + local result + function f178() + if not result then + result = f176() + f177() + end + return result + end + end + local f179 + do + local result + function f179() + if not result then + result = f177() + f178() + end + return result + end + end + local f180 + do + local result + function f180() + if not result then + result = f178() + f179() + end + return result + end + end + local f181 + do + local result + function f181() + if not result then + result = f179() + f180() + end + return result + end + end + local f182 + do + local result + function f182() + if not result then + result = f180() + f181() + end + return result + end + end + local f183 + do + local result + function f183() + if not result then + result = f181() + f182() + end + return result + end + end + local f184 + do + local result + function f184() + if not result then + result = f182() + f183() + end + return result + end + end + local f185 + do + local result + function f185() + if not result then + result = f183() + f184() + end + return result + end + end + local f186 + do + local result + function f186() + if not result then + result = f184() + f185() + end + return result + end + end + local f187 + do + local result + function f187() + if not result then + result = f185() + f186() + end + return result + end + end + local f188 + do + local result + function f188() + if not result then + result = f186() + f187() + end + return result + end + end + local f189 + do + local result + function f189() + if not result then + result = f187() + f188() + end + return result + end + end + local f190 + do + local result + function f190() + if not result then + result = f188() + f189() + end + return result + end + end + local f191 + do + local result + function f191() + if not result then + result = f189() + f190() + end + return result + end + end + local f192 + do + local result + function f192() + if not result then + result = f190() + f191() + end + return result + end + end + local f193 + do + local result + function f193() + if not result then + result = f191() + f192() + end + return result + end + end + local f194 + do + local result + function f194() + if not result then + result = f192() + f193() + end + return result + end + end + local f195 + do + local result + function f195() + if not result then + result = f193() + f194() + end + return result + end + end + local f196 + do + local result + function f196() + if not result then + result = f194() + f195() + end + return result + end + end + local f197 + do + local result + function f197() + if not result then + result = f195() + f196() + end + return result + end + end + local f198 + do + local result + function f198() + if not result then + result = f196() + f197() + end + return result + end + end + local f199 + do + local result + function f199() + if not result then + result = f197() + f198() + end + return result + end + end + print("5th fibonacci number is", f5()) + print("10th fibonacci number is", f10()) + print("199th fibonacci number is", f199()) + +5th fibonacci number is 5 +10th fibonacci number is 55 +199th fibonacci number is 1.734025211728e+41 diff --git a/luaj-test/src/test/resources/mathlib.lua b/luaj-test/src/test/resources/compatibility/mathlib.lua similarity index 100% rename from luaj-test/src/test/resources/mathlib.lua rename to luaj-test/src/test/resources/compatibility/mathlib.lua diff --git a/luaj-test/src/test/resources/compatibility/mathlib.out b/luaj-test/src/test/resources/compatibility/mathlib.out new file mode 100644 index 00000000..b3fb3be1 --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/mathlib.out @@ -0,0 +1,842 @@ +---------- miscellaneous tests ---------- +math.sin( 0.0 ) true +math.cos( math.pi ) true -1 +math.sqrt( 9.0 ) true 3 +math.modf( 5.25 ) true 5 0.25 +math.frexp(0.00625) true 0.8 -7 +-5 ^ 2 true -25 +-5 / 2 true -2.5 +-5 % 2 true 1 +---------- constants ---------- +math.huge true +math.pi true 3.1415 +---------- unary operator - ---------- +--2.5 true +--2 true +-0 true +-2 true -2 +-2.5 true -2.5 +-'-2.5' true 2.5 +-'-2' true 2 +-'0' true +-'2' true -2 +-'2.5' true -2.5 +---------- unary operator not ---------- +not -2.5 true false +not -2 true false +not 0 true false +not 2 true false +not 2.5 true false +not '-2.5' true false +not '-2' true false +not '0' true false +not '2' true false +not '2.5' true false +---------- binary operator + ---------- +2+0 true 2 +-2.5+0 true -2.5 +2+1 true 3 +5+2 true 7 +-5+2 true -3 +16+2 true 18 +-16+-2 true -18 +0.5+0 true 0.5 +0.5+1 true 1.5 +0.5+2 true 2.5 +0.5+-1 true -0.5 +0.5+2 true 2.5 +2.25+0 true 2.25 +2.25+2 true 4.25 +-2+0 true -2 +3+3 true 6 +'2'+'0' true 2 +'2.5'+'3' true 5.5 +'-2'+'1.5' true -0.5 +'-2.5'+'-1.5' true -4 +'3.0'+'3.0' true 6 +2.75+2.75 true 5.5 +'2.75'+'2.75' true 5.5 +3+'3' true 6 +'3'+3 true 6 +2.75+'2.75' true 5.5 +'2.75'+2.75 true 5.5 +-3+'-4' true -7 +'-3'+4 true 1 +-3+'4' true 1 +'-3'+-4 true -7 +-4.75+'2.75' true -2 +'-2.75'+1.75 true -1 +4.75+'-2.75' true 2 +'2.75'+-1.75 true 1 +---------- binary operator - ---------- +2-0 true 2 +-2.5-0 true -2.5 +2-1 true 1 +5-2 true 3 +-5-2 true -7 +16-2 true 14 +-16--2 true -14 +0.5-0 true 0.5 +0.5-1 true -0.5 +0.5-2 true -1.5 +0.5--1 true 1.5 +0.5-2 true -1.5 +2.25-0 true 2.25 +2.25-2 true 0.25 +-2-0 true -2 +3-3 true +'2'-'0' true 2 +'2.5'-'3' true -0.5 +'-2'-'1.5' true -3.5 +'-2.5'-'-1.5' true -1 +'3.0'-'3.0' true +2.75-2.75 true +'2.75'-'2.75' true +3-'3' true +'3'-3 true +2.75-'2.75' true +'2.75'-2.75 true +-3-'-4' true 1 +'-3'-4 true -7 +-3-'4' true -7 +'-3'--4 true 1 +-4.75-'2.75' true -7.5 +'-2.75'-1.75 true -4.5 +4.75-'-2.75' true 7.5 +'2.75'--1.75 true 4.5 +---------- binary operator * ---------- +2*0 true +-2.5*0 true +2*1 true 2 +5*2 true 10 +-5*2 true -10 +16*2 true 32 +-16*-2 true 32 +0.5*0 true +0.5*1 true 0.5 +0.5*2 true 1 +0.5*-1 true -0.5 +0.5*2 true 1 +2.25*0 true +2.25*2 true 4.5 +-2*0 true +3*3 true 9 +'2'*'0' true +'2.5'*'3' true 7.5 +'-2'*'1.5' true -3 +'-2.5'*'-1.5' true 3.75 +'3.0'*'3.0' true 9 +2.75*2.75 true 7.5625 +'2.75'*'2.75' true 7.5625 +3*'3' true 9 +'3'*3 true 9 +2.75*'2.75' true 7.5625 +'2.75'*2.75 true 7.5625 +-3*'-4' true 12 +'-3'*4 true -12 +-3*'4' true -12 +'-3'*-4 true 12 +-4.75*'2.75' true -13.06 +'-2.75'*1.75 true -4.812 +4.75*'-2.75' true -13.06 +'2.75'*-1.75 true -4.812 +---------- binary operator ^ ---------- +2^0 true 1 +-2.5^0 true 1 +2^1 true 2 +5^2 true 25 +-5^2 true 25 +16^2 true 256 +-16^-2 true 0.0039 +0.5^0 true 1 +0.5^1 true 0.5 +0.5^2 true 0.25 +0.5^-1 true 2 +0.5^2 true 0.25 +2.25^0 true 1 +2.25^2 true 5.0625 +-2^0 true 1 +3^3 true 27 +'2'^'0' true 1 +'2.5'^'3' true 15.625 +'-2'^'1.5' true +'-2.5'^'-1.5' true +'3.0'^'3.0' true 27 +2.75^2.75 true 16.149 +'2.75'^'2.75' true 16.149 +3^'3' true 27 +'3'^3 true 27 +2.75^'2.75' true 16.149 +'2.75'^2.75 true 16.149 +-3^'-4' true 0.0123 +'-3'^4 true 81 +-3^'4' true 81 +'-3'^-4 true 0.0123 +-4.75^'2.75' true +'-2.75'^1.75 true +4.75^'-2.75' true 0.0137 +'2.75'^-1.75 true 0.1702 +---------- binary operator / ---------- +2/0 true +-2.5/0 true +2/1 true 2 +5/2 true 2.5 +-5/2 true -2.5 +16/2 true 8 +-16/-2 true 8 +0.5/0 true +0.5/1 true 0.5 +0.5/2 true 0.25 +0.5/-1 true -0.5 +0.5/2 true 0.25 +2.25/0 true +2.25/2 true 1.125 +-2/0 true +3/3 true 1 +'2'/'0' true +'2.5'/'3' true 0.8333 +'-2'/'1.5' true -1.333 +'-2.5'/'-1.5' true 1.6666 +'3.0'/'3.0' true 1 +2.75/2.75 true 1 +'2.75'/'2.75' true 1 +3/'3' true 1 +'3'/3 true 1 +2.75/'2.75' true 1 +'2.75'/2.75 true 1 +-3/'-4' true 0.75 +'-3'/4 true -0.75 +-3/'4' true -0.75 +'-3'/-4 true 0.75 +-4.75/'2.75' true -1.727 +'-2.75'/1.75 true -1.571 +4.75/'-2.75' true -1.727 +'2.75'/-1.75 true -1.571 +---------- binary operator % ---------- +2%0 true +-2.5%0 true +2%1 true +5%2 true 1 +-5%2 true 1 +16%2 true +-16%-2 true +0.5%0 true +0.5%1 true 0.5 +0.5%2 true 0.5 +0.5%-1 true -0.5 +0.5%2 true 0.5 +2.25%0 true +2.25%2 true 0.25 +-2%0 true +3%3 true +'2'%'0' true +'2.5'%'3' true 2.5 +'-2'%'1.5' true 1 +'-2.5'%'-1.5' true -1 +'3.0'%'3.0' true +2.75%2.75 true +'2.75'%'2.75' true +3%'3' true +'3'%3 true +2.75%'2.75' true +'2.75'%2.75 true +-3%'-4' true -3 +'-3'%4 true 1 +-3%'4' true 1 +'-3'%-4 true -3 +-4.75%'2.75' true 0.75 +'-2.75'%1.75 true 0.75 +4.75%'-2.75' true -0.75 +'2.75'%-1.75 true -0.75 +---------- binary operator == ---------- +2==0 true false +-2.5==0 true false +2==1 true false +5==2 true false +-5==2 true false +16==2 true false +-16==-2 true false +0.5==0 true false +0.5==1 true false +0.5==2 true false +0.5==-1 true false +0.5==2 true false +2.25==0 true false +2.25==2 true false +-2==0 true false +3==3 true true +'2'=='0' true false +'2.5'=='3' true false +'-2'=='1.5' true false +'-2.5'=='-1.5' true false +'3.0'=='3.0' true true +2.75==2.75 true true +'2.75'=='2.75' true true +---------- binary operator ~= ---------- +2~=0 true true +-2.5~=0 true true +2~=1 true true +5~=2 true true +-5~=2 true true +16~=2 true true +-16~=-2 true true +0.5~=0 true true +0.5~=1 true true +0.5~=2 true true +0.5~=-1 true true +0.5~=2 true true +2.25~=0 true true +2.25~=2 true true +-2~=0 true true +3~=3 true false +'2'~='0' true true +'2.5'~='3' true true +'-2'~='1.5' true true +'-2.5'~='-1.5' true true +'3.0'~='3.0' true false +2.75~=2.75 true false +'2.75'~='2.75' true false +---------- binary operator > ---------- +2>0 true true +-2.5>0 true false +2>1 true true +5>2 true true +-5>2 true false +16>2 true true +-16>-2 true false +0.5>0 true true +0.5>1 true false +0.5>2 true false +0.5>-1 true true +0.5>2 true false +2.25>0 true true +2.25>2 true true +-2>0 true false +3>3 true false +'2'>'0' true true +'2.5'>'3' true false +'-2'>'1.5' true false +'-2.5'>'-1.5' true true +'3.0'>'3.0' true false +2.75>2.75 true false +'2.75'>'2.75' true false +---------- binary operator < ---------- +2<0 true false +-2.5<0 true true +2<1 true false +5<2 true false +-5<2 true true +16<2 true false +-16<-2 true true +0.5<0 true false +0.5<1 true true +0.5<2 true true +0.5<-1 true false +0.5<2 true true +2.25<0 true false +2.25<2 true false +-2<0 true true +3<3 true false +'2'<'0' true false +'2.5'<'3' true true +'-2'<'1.5' true true +'-2.5'<'-1.5' true false +'3.0'<'3.0' true false +2.75<2.75 true false +'2.75'<'2.75' true false +---------- binary operator >= ---------- +2>=0 true true +-2.5>=0 true false +2>=1 true true +5>=2 true true +-5>=2 true false +16>=2 true true +-16>=-2 true false +0.5>=0 true true +0.5>=1 true false +0.5>=2 true false +0.5>=-1 true true +0.5>=2 true false +2.25>=0 true true +2.25>=2 true true +-2>=0 true false +3>=3 true true +'2'>='0' true true +'2.5'>='3' true false +'-2'>='1.5' true false +'-2.5'>='-1.5' true true +'3.0'>='3.0' true true +2.75>=2.75 true true +'2.75'>='2.75' true true +---------- binary operator <= ---------- +2<=0 true false +-2.5<=0 true true +2<=1 true false +5<=2 true false +-5<=2 true true +16<=2 true false +-16<=-2 true true +0.5<=0 true false +0.5<=1 true true +0.5<=2 true true +0.5<=-1 true false +0.5<=2 true true +2.25<=0 true false +2.25<=2 true false +-2<=0 true true +3<=3 true true +'2'<='0' true false +'2.5'<='3' true true +'-2'<='1.5' true true +'-2.5'<='-1.5' true false +'3.0'<='3.0' true true +2.75<=2.75 true true +'2.75'<='2.75' true true +---------- math.abs ---------- +math.abs(-2.5) true 2.5 +math.abs(-2) true 2 +math.abs(0) true +math.abs(2) true 2 +math.abs(2.5) true 2.5 +math.abs('-2.5') true 2.5 +math.abs('-2') true 2 +math.abs('0') true +math.abs('2') true 2 +math.abs('2.5') true 2.5 +---------- math.ceil ---------- +math.ceil(-2.5) true -2 +math.ceil(-2) true -2 +math.ceil(0) true +math.ceil(2) true 2 +math.ceil(2.5) true 3 +math.ceil('-2.5') true -2 +math.ceil('-2') true -2 +math.ceil('0') true +math.ceil('2') true 2 +math.ceil('2.5') true 3 +---------- math.cos ---------- +math.cos(-2.5) true -0.801 +math.cos(-2) true -0.416 +math.cos(0) true 1 +math.cos(2) true -0.416 +math.cos(2.5) true -0.801 +math.cos('-2.5') true -0.801 +math.cos('-2') true -0.416 +math.cos('0') true 1 +math.cos('2') true -0.416 +math.cos('2.5') true -0.801 +---------- math.deg ---------- +math.deg(-2.5) true -143.2 +math.deg(-2) true -114.5 +math.deg(0) true +math.deg(2) true 114.59 +math.deg(2.5) true 143.23 +math.deg('-2.5') true -143.2 +math.deg('-2') true -114.5 +math.deg('0') true +math.deg('2') true 114.59 +math.deg('2.5') true 143.23 +---------- math.exp ---------- +math.exp(-2.5) true 0.0820 +math.exp(-2) true 0.1353 +math.exp(0) true 1 +math.exp(2) true 7.3890 +math.exp(2.5) true 12.182 +math.exp('-2.5') true 0.0820 +math.exp('-2') true 0.1353 +math.exp('0') true 1 +math.exp('2') true 7.3890 +math.exp('2.5') true 12.182 +---------- math.floor ---------- +math.floor(-2.5) true -3 +math.floor(-2) true -2 +math.floor(0) true +math.floor(2) true 2 +math.floor(2.5) true 2 +math.floor('-2.5') true -3 +math.floor('-2') true -2 +math.floor('0') true +math.floor('2') true 2 +math.floor('2.5') true 2 +---------- math.frexp ---------- +math.frexp(-2.5) true -0.625 2 +math.frexp(-2) true -0.5 2 +math.frexp(0) true +math.frexp(2) true 0.5 2 +math.frexp(2.5) true 0.625 2 +math.frexp('-2.5') true -0.625 2 +math.frexp('-2') true -0.5 2 +math.frexp('0') true +math.frexp('2') true 0.5 2 +math.frexp('2.5') true 0.625 2 +---------- math.modf ---------- +math.modf(-2.5) true -2 -0.5 +math.modf(-2) true -2 +math.modf(0) true +math.modf(2) true 2 +math.modf(2.5) true 2 0.5 +math.modf('-2.5') true -2 -0.5 +math.modf('-2') true -2 +math.modf('0') true +math.modf('2') true 2 +math.modf('2.5') true 2 0.5 +---------- math.rad ---------- +math.rad(-2.5) true -0.043 +math.rad(-2) true -0.034 +math.rad(0) true +math.rad(2) true 0.0349 +math.rad(2.5) true 0.0436 +math.rad('-2.5') true -0.043 +math.rad('-2') true -0.034 +math.rad('0') true +math.rad('2') true 0.0349 +math.rad('2.5') true 0.0436 +---------- math.sin ---------- +math.sin(-2.5) true -0.598 +math.sin(-2) true -0.909 +math.sin(0) true +math.sin(2) true 0.9092 +math.sin(2.5) true 0.5984 +math.sin('-2.5') true -0.598 +math.sin('-2') true -0.909 +math.sin('0') true +math.sin('2') true 0.9092 +math.sin('2.5') true 0.5984 +---------- math.sqrt ---------- +math.sqrt(-2.5) true +math.sqrt(-2) true +math.sqrt(0) true +math.sqrt(2) true 1.4142 +math.sqrt(2.5) true 1.5811 +math.sqrt('-2.5') true +math.sqrt('-2') true +math.sqrt('0') true +math.sqrt('2') true 1.4142 +math.sqrt('2.5') true 1.5811 +---------- math.tan ---------- +math.tan(-2.5) true 0.7470 +math.tan(-2) true 2.1850 +math.tan(0) true +math.tan(2) true -2.185 +math.tan(2.5) true -0.747 +math.tan('-2.5') true 0.7470 +math.tan('-2') true 2.1850 +math.tan('0') true +math.tan('2') true -2.185 +math.tan('2.5') true -0.747 +---------- math.acos (jse only) ---------- +math.acos(-2.5) true +math.acos(-2) true +math.acos(0) true 1.5707 +math.acos(2) true +math.acos(2.5) true +math.acos('-2.5') true +math.acos('-2') true +math.acos('0') true 1.5707 +math.acos('2') true +math.acos('2.5') true +---------- math.asin (jse only) ---------- +math.asin(-2.5) true +math.asin(-2) true +math.asin(0) true +math.asin(2) true +math.asin(2.5) true +math.asin('-2.5') true +math.asin('-2') true +math.asin('0') true +math.asin('2') true +math.asin('2.5') true +---------- math.atan (jse only) ---------- +math.atan(-2.5) true -1.190 +math.atan(-2) true -1.107 +math.atan(0) true +math.atan(2) true 1.1071 +math.atan(2.5) true 1.1902 +math.atan('-2.5') true -1.190 +math.atan('-2') true -1.107 +math.atan('0') true +math.atan('2') true 1.1071 +math.atan('2.5') true 1.1902 +---------- math.cosh (jse only) ---------- +math.cosh(-2.5) true 6.1322 +math.cosh(-2) true 3.7621 +math.cosh(0) true 1 +math.cosh(2) true 3.7621 +math.cosh(2.5) true 6.1322 +math.cosh('-2.5') true 6.1322 +math.cosh('-2') true 3.7621 +math.cosh('0') true 1 +math.cosh('2') true 3.7621 +math.cosh('2.5') true 6.1322 +---------- math.log (jse only) ---------- +math.log(-2.5) true +math.log(-2) true +math.log(0) true +math.log(2) true 0.6931 +math.log(2.5) true 0.9162 +math.log('-2.5') true +math.log('-2') true +math.log('0') true +math.log('2') true 0.6931 +math.log('2.5') true 0.9162 +---------- math.sinh (jse only) ---------- +math.sinh(-2.5) true -6.050 +math.sinh(-2) true -3.626 +math.sinh(0) true +math.sinh(2) true 3.6268 +math.sinh(2.5) true 6.0502 +math.sinh('-2.5') true -6.050 +math.sinh('-2') true -3.626 +math.sinh('0') true +math.sinh('2') true 3.6268 +math.sinh('2.5') true 6.0502 +---------- math.tanh (jse only) ---------- +math.tanh(-2.5) true -0.986 +math.tanh(-2) true -0.964 +math.tanh(0) true +math.tanh(2) true 0.9640 +math.tanh(2.5) true 0.9866 +math.tanh('-2.5') true -0.986 +math.tanh('-2') true -0.964 +math.tanh('0') true +math.tanh('2') true 0.9640 +math.tanh('2.5') true 0.9866 +---------- math.fmod ---------- +math.fmod(2,0) true +math.fmod(-2.5,0) true +math.fmod(2,1) true +math.fmod(5,2) true 1 +math.fmod(-5,2) true -1 +math.fmod(16,2) true +math.fmod(-16,-2) true +math.fmod(0.5,0) true +math.fmod(0.5,1) true 0.5 +math.fmod(0.5,2) true 0.5 +math.fmod(0.5,-1) true 0.5 +math.fmod(0.5,2) true 0.5 +math.fmod(2.25,0) true +math.fmod(2.25,2) true 0.25 +math.fmod(-2,0) true +math.fmod(3,3) true +math.fmod('2','0') true +math.fmod('2.5','3') true 2.5 +math.fmod('-2','1.5') true -0.5 +math.fmod('-2.5','-1.5') true -1 +math.fmod('3.0','3.0') true +math.fmod(2.75,2.75) true +math.fmod('2.75','2.75') true +math.fmod(3,'3') true +math.fmod('3',3) true +math.fmod(2.75,'2.75') true +math.fmod('2.75',2.75) true +math.fmod(-3,'-4') true -3 +math.fmod('-3',4) true -3 +math.fmod(-3,'4') true -3 +math.fmod('-3',-4) true -3 +math.fmod(-4.75,'2.75') true -2 +math.fmod('-2.75',1.75) true -1 +math.fmod(4.75,'-2.75') true 2 +math.fmod('2.75',-1.75) true 1 +---------- math.ldexp ---------- +math.ldexp(2,0) true 2 +math.ldexp(-2.5,0) true -2.5 +math.ldexp(2,1) true 4 +math.ldexp(5,2) true 20 +math.ldexp(-5,2) true -20 +math.ldexp(16,2) true 64 +math.ldexp(-16,-2) true -4 +math.ldexp(0.5,0) true 0.5 +math.ldexp(0.5,1) true 1 +math.ldexp(0.5,2) true 2 +math.ldexp(0.5,-1) true 0.25 +math.ldexp(0.5,2) true 2 +math.ldexp(2.25,0) true 2.25 +math.ldexp(2.25,2) true 9 +math.ldexp(-2,0) true -2 +math.ldexp(3,3) true 24 +math.ldexp('2','0') true 2 +math.ldexp('2.5','3') true 20 +math.ldexp('-2','1.5') true -4 +math.ldexp('-2.5','-1.5') true -1.25 +math.ldexp('3.0','3.0') true 24 +math.ldexp(2.75,2.75) true 11 +math.ldexp('2.75','2.75') true 11 +math.ldexp(3,'3') true 24 +math.ldexp('3',3) true 24 +math.ldexp(2.75,'2.75') true 11 +math.ldexp('2.75',2.75) true 11 +math.ldexp(-3,'-4') true -0.187 +math.ldexp('-3',4) true -48 +math.ldexp(-3,'4') true -48 +math.ldexp('-3',-4) true -0.187 +math.ldexp(-4.75,'2.75') true -19 +math.ldexp('-2.75',1.75) true -5.5 +math.ldexp(4.75,'-2.75') true 1.1875 +math.ldexp('2.75',-1.75) true 1.375 +---------- math.pow ---------- +math.pow(2,0) true 1 +math.pow(-2.5,0) true 1 +math.pow(2,1) true 2 +math.pow(5,2) true 25 +math.pow(-5,2) true 25 +math.pow(16,2) true 256 +math.pow(-16,-2) true 0.0039 +math.pow(0.5,0) true 1 +math.pow(0.5,1) true 0.5 +math.pow(0.5,2) true 0.25 +math.pow(0.5,-1) true 2 +math.pow(0.5,2) true 0.25 +math.pow(2.25,0) true 1 +math.pow(2.25,2) true 5.0625 +math.pow(-2,0) true 1 +math.pow(3,3) true 27 +math.pow('2','0') true 1 +math.pow('2.5','3') true 15.625 +math.pow('-2','1.5') true +math.pow('-2.5','-1.5') true +math.pow('3.0','3.0') true 27 +math.pow(2.75,2.75) true 16.149 +math.pow('2.75','2.75') true 16.149 +math.pow(3,'3') true 27 +math.pow('3',3) true 27 +math.pow(2.75,'2.75') true 16.149 +math.pow('2.75',2.75) true 16.149 +math.pow(-3,'-4') true 0.0123 +math.pow('-3',4) true 81 +math.pow(-3,'4') true 81 +math.pow('-3',-4) true 0.0123 +math.pow(-4.75,'2.75') true +math.pow('-2.75',1.75) true +math.pow(4.75,'-2.75') true 0.0137 +math.pow('2.75',-1.75) true 0.1702 +---------- math.atan2 (jse only) ---------- +math.atan2(2,0) true 1.5707 +math.atan2(-2.5,0) true -1.570 +math.atan2(2,1) true 1.1071 +math.atan2(5,2) true 1.1902 +math.atan2(-5,2) true -1.190 +math.atan2(16,2) true 1.4464 +math.atan2(-16,-2) true -1.695 +math.atan2(0.5,0) true 1.5707 +math.atan2(0.5,1) true 0.4636 +math.atan2(0.5,2) true 0.2449 +math.atan2(0.5,-1) true 2.6779 +math.atan2(0.5,2) true 0.2449 +math.atan2(2.25,0) true 1.5707 +math.atan2(2.25,2) true 0.8441 +math.atan2(-2,0) true -1.570 +math.atan2(3,3) true 0.7853 +math.atan2('2','0') true 1.5707 +math.atan2('2.5','3') true 0.6947 +math.atan2('-2','1.5') true -0.927 +math.atan2('-2.5','-1.5') true -2.111 +math.atan2('3.0','3.0') true 0.7853 +math.atan2(2.75,2.75) true 0.7853 +math.atan2('2.75','2.75') true 0.7853 +math.atan2(3,'3') true 0.7853 +math.atan2('3',3) true 0.7853 +math.atan2(2.75,'2.75') true 0.7853 +math.atan2('2.75',2.75) true 0.7853 +math.atan2(-3,'-4') true -2.498 +math.atan2('-3',4) true -0.643 +math.atan2(-3,'4') true -0.643 +math.atan2('-3',-4) true -2.498 +math.atan2(-4.75,'2.75') true -1.046 +math.atan2('-2.75',1.75) true -1.004 +math.atan2(4.75,'-2.75') true 2.0955 +math.atan2('2.75',-1.75) true 2.1375 +---------- math.max ---------- +math.max(4) true 4 +math.max(-4.5) true -4.5 +math.max('5.5') true 5.5 +math.max('-5') true -5 +math.max(4,'8') true 8 +math.max(-4.5,'-8') true -4.5 +math.max('5.5',2.2) true 5.5 +math.max('-5',-2.2) true -2.2 +math.max(111,222,333) true 333 +math.max(-222,-333,-111) true -111 +math.max(444,-111,-222) true 444 +---------- math.min ---------- +math.min(4) true 4 +math.min(-4.5) true -4.5 +math.min('5.5') true 5.5 +math.min('-5') true -5 +math.min(4,'8') true 4 +math.min(-4.5,'-8') true -8 +math.min('5.5',2.2) true 2.2 +math.min('-5',-2.2) true -5 +math.min(111,222,333) true 111 +math.min(-222,-333,-111) true -333 +math.min(444,-111,-222) true -222 +----------- Random number tests +math.random() number true +math.random() number true +math.random() number true +math.random() number true +math.random() number true +math.random(5,10) number true +math.random(5,10) number true +math.random(5,10) number true +math.random(5,10) number true +math.random(5,10) number true +math.random(30) number true +math.random(30) number true +math.random(30) number true +math.random(30) number true +math.random(30) number true +math.random(-4,-2) number true +math.random(-4,-2) number true +math.random(-4,-2) number true +math.random(-4,-2) number true +math.random(-4,-2) number true + +-- comparing new numbers +false false +false false +false false +false false +false false +false false +false false +false false +false false +false false +false false +false false +false false +false false +false false +false false +false false +false false +false false +false false +-- resetting seed + +true +true +true +true +true +true +true +true +true +true +true +true +true +true +true +true +true +true +true +true +----------- Tests involving -0 and NaN +0 == -0 true +t[-0] == t[0] true +mz, z +mz == z true +a[z] == 1 and a[mz] == 1 true diff --git a/luaj-test/src/test/resources/metatags.lua b/luaj-test/src/test/resources/compatibility/metatags.lua similarity index 100% rename from luaj-test/src/test/resources/metatags.lua rename to luaj-test/src/test/resources/compatibility/metatags.lua diff --git a/luaj-test/src/test/resources/compatibility/metatags.out b/luaj-test/src/test/resources/compatibility/metatags.out new file mode 100644 index 00000000..694cb7eb --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/metatags.out @@ -0,0 +1,649 @@ +---- __eq same types +nil nil before true true +nil nil before true false +nil +nil +nil nil after true true +nil nil after true false +nil +nil +boolean boolean before true false +boolean boolean before true true +true +false +boolean boolean after true false +boolean boolean after true true +true +false +number number before true false +number number before true true +123 +456 +number number after true false +number number after true true +123 +456 +number number before true false +number number before true true +11 +5.5 +number number after true false +number number after true true +11 +5.5 +function function before true false +function function before true true +function.1 +function.2 +function function after true false +function function after true true +function.1 +function.2 +thread nil before true false +thread nil before true true +thread.3 +nil +thread nil after true false +thread nil after true true +thread.3 +nil +string string before true false +string string before true true +abc +def +string string after true false +string string after true true +abc +def +number string before true false +number string before true true +111 +111 +number string after true false +number string after true true +111 +111 +---- __eq, tables - should invoke metatag comparison +table table before true false +table table before true true +table.4 +table.5 +mt.__eq() table.4 table.5 +table table after-a true true +mt.__eq() table.4 table.5 +table table after-a true false +table.4 +table.5 +nilmt nil +boolmt nil +number nil +function nil +thread nil +---- __call +number before false attempt to call +111 +mt.__call() 111 nil +number after true __call-result +mt.__call() 111 a +number after true __call-result +mt.__call() 111 a +number after true __call-result +mt.__call() 111 a +number after true __call-result +mt.__call() 111 a +number after true __call-result +111 +boolean before false attempt to call +false +mt.__call() false nil +boolean after true __call-result +mt.__call() false a +boolean after true __call-result +mt.__call() false a +boolean after true __call-result +mt.__call() false a +boolean after true __call-result +mt.__call() false a +boolean after true __call-result +false +function before true nil +function.1 +function after true +function after true +function after true +function after true +function after true +function.1 +thread before false attempt to call +thread.3 +mt.__call() thread.3 nil +thread after true __call-result +mt.__call() thread.3 a +thread after true __call-result +mt.__call() thread.3 a +thread after true __call-result +mt.__call() thread.3 a +thread after true __call-result +mt.__call() thread.3 a +thread after true __call-result +thread.3 +table before false attempt to call +table.4 +mt.__call() table.4 nil +table after true __call-result +mt.__call() table.4 a +table after true __call-result +mt.__call() table.4 a +table after true __call-result +mt.__call() table.4 a +table after true __call-result +mt.__call() table.4 a +table after true __call-result +table.4 +---- __add, __sub, __mul, __div, __pow, __mod +boolean boolean before false attempt to perform arithmetic +boolean boolean before false attempt to perform arithmetic +boolean boolean before false attempt to perform arithmetic +boolean boolean before false attempt to perform arithmetic +boolean boolean before false attempt to perform arithmetic +boolean boolean before false attempt to perform arithmetic +boolean boolean before false attempt to perform arithmetic +boolean boolean before false attempt to perform arithmetic +boolean boolean before false attempt to perform arithmetic +boolean boolean before false attempt to perform arithmetic +false +mt.__add() false false +boolean boolean after true __add-result +mt.__add() false false +boolean boolean after true __add-result +mt.__sub() false false +boolean boolean after true __sub-result +mt.__sub() false false +boolean boolean after true __sub-result +mt.__mul() false false +boolean boolean after true __mul-result +mt.__mul() false false +boolean boolean after true __mul-result +mt.__pow() false false +boolean boolean after true __pow-result +mt.__pow() false false +boolean boolean after true __pow-result +mt.__mod() false false +boolean boolean after true __mod-result +mt.__mod() false false +boolean boolean after true __mod-result +false +false +boolean thread before false attempt to perform arithmetic +boolean thread before false attempt to perform arithmetic +boolean thread before false attempt to perform arithmetic +boolean thread before false attempt to perform arithmetic +boolean thread before false attempt to perform arithmetic +boolean thread before false attempt to perform arithmetic +boolean thread before false attempt to perform arithmetic +boolean thread before false attempt to perform arithmetic +boolean thread before false attempt to perform arithmetic +boolean thread before false attempt to perform arithmetic +false +mt.__add() false thread.3 +boolean thread after true __add-result +mt.__add() thread.3 false +boolean thread after true __add-result +mt.__sub() false thread.3 +boolean thread after true __sub-result +mt.__sub() thread.3 false +boolean thread after true __sub-result +mt.__mul() false thread.3 +boolean thread after true __mul-result +mt.__mul() thread.3 false +boolean thread after true __mul-result +mt.__pow() false thread.3 +boolean thread after true __pow-result +mt.__pow() thread.3 false +boolean thread after true __pow-result +mt.__mod() false thread.3 +boolean thread after true __mod-result +mt.__mod() thread.3 false +boolean thread after true __mod-result +false +thread.3 +boolean function before false attempt to perform arithmetic +boolean function before false attempt to perform arithmetic +boolean function before false attempt to perform arithmetic +boolean function before false attempt to perform arithmetic +boolean function before false attempt to perform arithmetic +boolean function before false attempt to perform arithmetic +boolean function before false attempt to perform arithmetic +boolean function before false attempt to perform arithmetic +boolean function before false attempt to perform arithmetic +boolean function before false attempt to perform arithmetic +false +mt.__add() false function.1 +boolean function after true __add-result +mt.__add() function.1 false +boolean function after true __add-result +mt.__sub() false function.1 +boolean function after true __sub-result +mt.__sub() function.1 false +boolean function after true __sub-result +mt.__mul() false function.1 +boolean function after true __mul-result +mt.__mul() function.1 false +boolean function after true __mul-result +mt.__pow() false function.1 +boolean function after true __pow-result +mt.__pow() function.1 false +boolean function after true __pow-result +mt.__mod() false function.1 +boolean function after true __mod-result +mt.__mod() function.1 false +boolean function after true __mod-result +false +function.1 +boolean string before false attempt to perform arithmetic +boolean string before false attempt to perform arithmetic +boolean string before false attempt to perform arithmetic +boolean string before false attempt to perform arithmetic +boolean string before false attempt to perform arithmetic +boolean string before false attempt to perform arithmetic +boolean string before false attempt to perform arithmetic +boolean string before false attempt to perform arithmetic +boolean string before false attempt to perform arithmetic +boolean string before false attempt to perform arithmetic +false +mt.__add() false abc +boolean string after true __add-result +mt.__add() abc false +boolean string after true __add-result +mt.__sub() false abc +boolean string after true __sub-result +mt.__sub() abc false +boolean string after true __sub-result +mt.__mul() false abc +boolean string after true __mul-result +mt.__mul() abc false +boolean string after true __mul-result +mt.__pow() false abc +boolean string after true __pow-result +mt.__pow() abc false +boolean string after true __pow-result +mt.__mod() false abc +boolean string after true __mod-result +mt.__mod() abc false +boolean string after true __mod-result +false +abc +boolean table before false attempt to perform arithmetic +boolean table before false attempt to perform arithmetic +boolean table before false attempt to perform arithmetic +boolean table before false attempt to perform arithmetic +boolean table before false attempt to perform arithmetic +boolean table before false attempt to perform arithmetic +boolean table before false attempt to perform arithmetic +boolean table before false attempt to perform arithmetic +boolean table before false attempt to perform arithmetic +boolean table before false attempt to perform arithmetic +false +mt.__add() false table.4 +boolean table after true __add-result +mt.__add() table.4 false +boolean table after true __add-result +mt.__sub() false table.4 +boolean table after true __sub-result +mt.__sub() table.4 false +boolean table after true __sub-result +mt.__mul() false table.4 +boolean table after true __mul-result +mt.__mul() table.4 false +boolean table after true __mul-result +mt.__pow() false table.4 +boolean table after true __pow-result +mt.__pow() table.4 false +boolean table after true __pow-result +mt.__mod() false table.4 +boolean table after true __mod-result +mt.__mod() table.4 false +boolean table after true __mod-result +false +table.4 +---- __len +boolean before false attempt to get length of +false +mt.__len() false +boolean after true __len-result +false +function before false attempt to get length of +function.1 +mt.__len() function.1 +function after true __len-result +function.1 +thread before false attempt to get length of +thread.3 +mt.__len() thread.3 +thread after true __len-result +thread.3 +number before false attempt to get length of +111 +mt.__len() 111 +number after true __len-result +111 +---- __neg +nil before false attempt to perform arithmetic +false +mt.__unm() false +nil after true __unm-result +false +nil before false attempt to perform arithmetic +function.1 +mt.__unm() function.1 +nil after true __unm-result +function.1 +nil before false attempt to perform arithmetic +thread.3 +mt.__unm() thread.3 +nil after true __unm-result +thread.3 +nil before false attempt to perform arithmetic +abcd +mt.__unm() abcd +nil after true __unm-result +abcd +nil before false attempt to perform arithmetic +table.4 +mt.__unm() table.4 +nil after true __unm-result +table.4 +nil before true -111 +111 +nil after true -111 +111 +---- __lt, __le, same types +boolean boolean before false attempt to compare +boolean boolean before false attempt to compare +boolean boolean before false attempt to compare +boolean boolean before false attempt to compare +true +true +mt.__lt() true true +boolean boolean after true true +mt.__le() true true +boolean boolean after true true +mt.__lt() true true +boolean boolean after true true +mt.__le() true true +boolean boolean after true true +true +true +boolean boolean before false attempt to compare +boolean boolean before false attempt to compare +boolean boolean before false attempt to compare +boolean boolean before false attempt to compare +true +false +mt.__lt() true false +boolean boolean after true true +mt.__le() true false +boolean boolean after true true +mt.__lt() false true +boolean boolean after true true +mt.__le() false true +boolean boolean after true true +true +false +function function before false attempt to compare +function function before false attempt to compare +function function before false attempt to compare +function function before false attempt to compare +function.1 +function.6 +mt.__lt() function.1 function.6 +function function after true true +mt.__le() function.1 function.6 +function function after true true +mt.__lt() function.6 function.1 +function function after true true +mt.__le() function.6 function.1 +function function after true true +function.1 +function.6 +thread thread before false attempt to compare +thread thread before false attempt to compare +thread thread before false attempt to compare +thread thread before false attempt to compare +thread.3 +thread.7 +mt.__lt() thread.3 thread.7 +thread thread after true true +mt.__le() thread.3 thread.7 +thread thread after true true +mt.__lt() thread.7 thread.3 +thread thread after true true +mt.__le() thread.7 thread.3 +thread thread after true true +thread.3 +thread.7 +table table before false attempt to compare +table table before false attempt to compare +table table before false attempt to compare +table table before false attempt to compare +table.4 +table.4 +mt.__lt() table.4 table.4 +table table after true true +mt.__le() table.4 table.4 +table table after true true +mt.__lt() table.4 table.4 +table table after true true +mt.__le() table.4 table.4 +table table after true true +table.4 +table.4 +table table before false attempt to compare +table table before false attempt to compare +table table before false attempt to compare +table table before false attempt to compare +table.4 +table.8 +mt.__lt() table.4 table.8 +table table after true true +mt.__le() table.4 table.8 +table table after true true +mt.__lt() table.8 table.4 +table table after true true +mt.__le() table.8 table.4 +table table after true true +table.4 +table.8 +---- __lt, __le, different types +boolean thread before false attempt to compare +boolean thread before false attempt to compare +boolean thread before false attempt to compare +boolean thread before false attempt to compare +false +thread.3 +mt.__lt() false thread.3 +boolean thread after-a true true +mt.__le() false thread.3 +boolean thread after-a true true +mt.__lt() thread.3 false +boolean thread after-a true true +mt.__le() thread.3 false +boolean thread after-a true true +false +thread.3 +---- __tostring +mt.__tostring(boolean) +boolean after mt.__tostring(boolean) mt.__tostring(boolean) +false +function.1 +function after true mt.__tostring(function) +function.1 +thread.3 +thread after true mt.__tostring(thread) +thread.3 +table.4 +table after true mt.__tostring(table) +table.4 +mt.__tostring(string) +mt.__tostring(string) mt.__tostring(string) true mt.__tostring(string) +abc +---- __index, __newindex +boolean before false attempt to index +boolean before false attempt to index +boolean before false index +boolean before false index +boolean before false attempt to index +false +mt.__index() false foo +boolean after true __index-result +mt.__index() false 123 +boolean after true __index-result +mt.__newindex() false foo bar +boolean after true +mt.__newindex() false 123 bar +boolean after true +mt.__index() false foo +boolean after false attempt to call +false +number before false attempt to index +number before false attempt to index +number before false index +number before false index +number before false attempt to index +111 +mt.__index() 111 foo +number after true __index-result +mt.__index() 111 123 +number after true __index-result +mt.__newindex() 111 foo bar +number after true +mt.__newindex() 111 123 bar +number after true +mt.__index() 111 foo +number after false attempt to call +111 +function before false attempt to index +function before false attempt to index +function before false index +function before false index +function before false attempt to index +function.1 +mt.__index() function.1 foo +function after true __index-result +mt.__index() function.1 123 +function after true __index-result +mt.__newindex() function.1 foo bar +function after true +mt.__newindex() function.1 123 bar +function after true +mt.__index() function.1 foo +function after false attempt to call +function.1 +thread before false attempt to index +thread before false attempt to index +thread before false index +thread before false index +thread before false attempt to index +thread.3 +mt.__index() thread.3 foo +thread after true __index-result +mt.__index() thread.3 123 +thread after true __index-result +mt.__newindex() thread.3 foo bar +thread after true +mt.__newindex() thread.3 123 bar +thread after true +mt.__index() thread.3 foo +thread after false attempt to call +thread.3 +---- __concat +table function before false attempt to concatenate +table function before false attempt to concatenate +table string number before false attempt to concatenate +string table number before false attempt to concatenate +string number table before false attempt to concatenate +table.4 +mt.__concat(table,function) table.4 function.1 +table function after true table.9 +mt.__concat(function,table) function.1 table.4 +table function after true table.9 +mt.__concat(table,string) table.4 sss777 +table string number before true table.9 +mt.__concat(table,number) table.4 777 +string table number before false attempt to concatenate +mt.__concat(number,table) 777 table.4 +string number table before false attempt to concatenate +table.4 +function.1 +function table before false attempt to concatenate +function table before false attempt to concatenate +function string number before false attempt to concatenate +string function number before false attempt to concatenate +string number function before false attempt to concatenate +function.1 +mt.__concat(function,table) function.1 table.4 +function table after true table.9 +mt.__concat(table,function) table.4 function.1 +function table after true table.9 +mt.__concat(function,string) function.1 sss777 +function string number before true table.9 +mt.__concat(function,number) function.1 777 +string function number before false attempt to concatenate +mt.__concat(number,function) 777 function.1 +string number function before false attempt to concatenate +function.1 +table.4 +number nil before false attempt to concatenate +number nil before false attempt to concatenate +number string number before true 123sss777 +string number number before true sss123777 +string number number before true sss777123 +123 +mt.__concat(number,nil) 123 nil +number nil after true table.9 +mt.__concat(nil,number) nil 123 +number nil after true table.9 +number string number before true 123sss777 +string number number before true sss123777 +string number number before true sss777123 +123 +nil +nil number before false attempt to concatenate +nil number before false attempt to concatenate +nil string number before false attempt to concatenate +string nil number before false attempt to concatenate +string number nil before false attempt to concatenate +nil +mt.__concat(nil,number) nil 123 +nil number after true table.9 +mt.__concat(number,nil) 123 nil +nil number after true table.9 +mt.__concat(nil,string) nil sss777 +nil string number before true table.9 +mt.__concat(nil,number) nil 777 +string nil number before false attempt to concatenate +mt.__concat(number,nil) 777 nil +string number nil before false attempt to concatenate +nil +123 +---- __metatable +boolean before true nil nil +false +boolean after true table.10 table.11 +false +function before true nil nil +function.1 +function after true table.10 table.11 +function.1 +thread before true nil nil +thread.3 +thread after true table.10 table.11 +thread.3 +table before true nil nil +table.4 +table after true table.10 table.11 +table.4 +string before true table.12 table.12 +abc +string after true table.10 table.11 +abc diff --git a/luaj-test/src/test/resources/oslib.lua b/luaj-test/src/test/resources/compatibility/oslib.lua similarity index 100% rename from luaj-test/src/test/resources/oslib.lua rename to luaj-test/src/test/resources/compatibility/oslib.lua diff --git a/luaj-test/src/test/resources/compatibility/oslib.out b/luaj-test/src/test/resources/compatibility/oslib.out new file mode 100644 index 00000000..5148663e --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/oslib.out @@ -0,0 +1,49 @@ +os table +os.clock() true number nil +os.date() true string nil +os.difftime(123000, 21500) true number nil +os.getenv() false string nil +os.getenv("bogus.key") true nil nil +os.tmpname() true string +os.tmpname() true string +io.open true userdata +write false string nil +close false string nil +os.rename(p,q) true boolean nil +os.remove(q) true boolean nil +os.remove(q) true nil string +os.setlocale("C") true string nil +os.exit function +os.date('%a', 1281364496) true string nil +os.date('%A', 1281364496) true string nil +os.date('%b', 1281364496) true string nil +os.date('%B', 1281364496) true string nil +os.date('%c', 1281364496) true string nil +os.date('%d', 1281364496) true string nil +os.date('%H', 1281364496) true string nil +os.date('%I', 1281364496) true string nil +os.date('%j', 1281364496) true string nil +os.date('%m', 1281364496) true string nil +os.date('%M', 1281364496) true string nil +os.date('%p', 1281364496) true string nil +os.date('%S', 1281364496) true string nil +os.date('%U', 1281364496) true string nil +os.date('%w', 1281364496) true string nil +os.date('%W', 1281364496) true string nil +os.date('%x', 1281364496) true string nil +os.date('%X', 1281364496) true string nil +os.date('%y', 1281364496) true string nil +os.date('%Y', 1281364496) true string nil +os.date('%z', 1281364496) true string nil +k string year v number 2010 +k string month v number 8 +k string day v number 9 +k string hour v number 7 +k string min v number 34 +k string sec v number 56 +k string wday v number 2 +k string yday v number 221 +k string isdst v boolean true +type(os.time()) number +os.time({year=1971, month=2, day=25}) 36360000 +os.time({year=1971, month=2, day=25, hour=11, min=22, sec=33}) 36357753 diff --git a/luaj-test/src/test/resources/stringlib.lua b/luaj-test/src/test/resources/compatibility/stringlib.lua similarity index 100% rename from luaj-test/src/test/resources/stringlib.lua rename to luaj-test/src/test/resources/compatibility/stringlib.lua diff --git a/luaj-test/src/test/resources/compatibility/stringlib.out b/luaj-test/src/test/resources/compatibility/stringlib.out new file mode 100644 index 0000000000000000000000000000000000000000..7ebe326d4b15ea19da3261eb265cabe9c46b4859 GIT binary patch literal 10276 zcmd^F-*4MC5Z@2g@I}A__)g98BRe6z9QA1zPiONGTB6z;*LoAtd-m+7zU)TFMl5>$!?kL&*B9mfK1H4qx!xpMk&1^P4nuJl zM3Yby<$j&tJ}d5*y$+H|Z*K3_A3kQAyfX;<&vEpi3AhKDVI7ZQME-r2FVp&H(+RDu8ZZQ`h9~=6*3wa|L*vs!O22KgC__X4W1}uH26LtDf}mhAD^mY zY;<(X7#kTq+c7pOLc~6=B;tXc&)#VG1UYDuW12g6?(9_YW~YibGvc}V&5U+FL&M2u zX(T&|zA?|;o`=z?LV+cvtJf#(cdsR7tJjjm@>=@Xx9!z6!Qqx?H8c{qElu<~6)g^ZyQDLy><*g{{wj`cP7$JAx2>OQwLv7 z?hJgz7%j|PmatDKzvzc{gC}OAfzy!OS)%gQ)Xu%IcI_bV>B}rX+&q6+aM~UgoY>g{AbvIj7Y9h_%2(A^ z2$=6=z@jFRS(w-{1*chWSO>%ovXnJ2?05?kAnU-jfSxkrt1^hw>RE!Tl^BL!qrfm0 zq%cd*^+4pVEuPZSs4QGyhMOfcvvjNhEj{DhRZ`p)#a&R`^#oCORE820v;n!T?5ri~ zL4~$5>)YJ%c$l`LWpW~B!5z`psz`HoXAMD+XtlnWAWHkYT|p2gRy<6kc-U~_a1&VT zdm-kwwJ^HthNo;aszzJQ%A+P5bnQ=I?ct;+!^u%CoW;UjE9#|!iOA#>80y{K3c=JM{}EDFgpeNVb;mGxRs<(G345jsD zQKG`4BrJa;%OIY@ z0sr$ad&3Ew=6%r%YaP`K5epGKJA!AbN4AHqu|Cu06C5ek`3%mY7ePOY(F>fRE1P|N z0nge(s-K%1xS(3Gc8TrLbc*q+A7!9g+CVjxL9yQKvQ*YS#4bzLx$Fj`sVH{oY7K8S z$X>VT2jj`%7{vgpBc_X0+fV&qI2?9lw<{N+Ttp+e5V8Z88b-$9IH>xZgWDNi!Nxq8 zz)K{m9fitl?3y&}cEbfST!hgmT!_#!FHWSmKts<94SgKCDgcc_0MHm!0$6SHa=%py z9a%4?axnwev0TjIBa(}SCSSL0kcY`8lLODmd4;^Z?9c&)uhh+6}xE*FmUZ(q8u96~^C9KZDEZywN$3VSZHPnI~fHGNTDF?t?X7$VW zyWMfV*MG@Z7ni?7$^YZx&DG1dZ{+30yO;9n<@+n4&6xQ#z|5zC)_nW)bGk25&9Ho* zUdi-baw+q-=~aG_!Q3A&lUMTbwKy6wa~>gP)+5xKcXgK>WL^C7{BNPU+O=*ozLZVN z(c#Ut>-)_PmZB(s4%Dk|H{0#-*JVbK=4!9@HAsl@Wq literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/tablelib.lua b/luaj-test/src/test/resources/compatibility/tablelib.lua similarity index 100% rename from luaj-test/src/test/resources/tablelib.lua rename to luaj-test/src/test/resources/compatibility/tablelib.lua diff --git a/luaj-test/src/test/resources/compatibility/tablelib.out b/luaj-test/src/test/resources/compatibility/tablelib.out new file mode 100644 index 00000000..4f49801c --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/tablelib.out @@ -0,0 +1,245 @@ +2 +7 +-- concat tests +onetwothree +one--two--three +two,three +two + +onetwothreefourfive +one--two--three--four--five +two,three,four,five +two + + + + + + + + + + +-- insert, len tests +{[1]=one,[2]=two,[3]=three,[a]=aaa,[b]=bbb,[c]=ccc} 3 +{[1]=one,[2]=two,[3]=three,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4 +{[1]=seven,[2]=one,[3]=two,[4]=three,[5]=six,[a]=aaa,[b]=bbb,[c]=ccc} 5 +{[1]=seven,[2]=one,[3]=two,[4]=eight,[5]=three,[6]=six,[a]=aaa,[b]=bbb,[c]=ccc} 6 +{[1]=seven,[2]=one,[3]=two,[4]=eight,[5]=three,[6]=six,[7]=nine,[a]=aaa,[b]=bbb,[c]=ccc} 7 +{[10]=ten,[1]=seven,[2]=one,[3]=two,[4]=eight,[5]=three,[6]=six,[7]=nine,[a]=aaa,[b]=bbb,[c]=ccc} 7 +#{} 0 +#{"a"} 1 +#{"a","b"} 2 +#{"a",nil} 1 +#{nil,nil} 0 +#{nil,"b"} true +#{"a","b","c"} 3 +#{"a","b",nil} 2 +#{"a",nil,nil} 1 +#{nil,nil,nil} 0 +#{nil,nil,"c"} true +#{nil,"b","c"} true +#{nil,"b",nil} true +#{"a",nil,"c"} true +-- remove tests +{[10]=ten,[1]=one,[2]=two,[3]=three,[4]=four,[5]=five,[6]=six,[7]=seven,[a]=aaa,[b]=bbb,[c]=ccc} 7 +table.remove(t) seven +{[10]=ten,[1]=one,[2]=two,[3]=three,[4]=four,[5]=five,[6]=six,[a]=aaa,[b]=bbb,[c]=ccc} 6 +table.remove(t,1) one +{[10]=ten,[1]=two,[2]=three,[3]=four,[4]=five,[5]=six,[a]=aaa,[b]=bbb,[c]=ccc} 5 +table.remove(t,3) four +{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4 +table.remove(t,5) +{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4 +table.remove(t,10) +{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4 +table.remove(t,-1) +{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4 +table.remove(t,-1) +{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4 +-- sort tests +one-two-three +one-three-two +www-vvv-uuu-ttt-sss-zzz-yyy-xxx +sss-ttt-uuu-vvv-www-xxx-yyy-zzz +www-vvv-uuu-ttt-sss-zzz-yyy-xxx +zzz-yyy-xxx-www-vvv-uuu-ttt-sss +----- unpack tests ------- +pcall(unpack) false +pcall(unpack,nil) false +pcall(unpack,"abc") false +pcall(unpack,1) false +unpack({"aa"}) aa +unpack({"aa","bb"}) aa bb +unpack({"aa","bb","cc"}) aa bb cc +unpack - +unpack a a +unpack . nil +unpack ab a b +unpack .b nil b +unpack a. a nil +unpack abc a b c +unpack .ab nil a b +unpack a.b a nil b +unpack ab. a b nil +unpack ..b nil nil b +unpack a.. a nil nil +unpack .b. nil b nil +unpack ... nil nil nil +unpack (-) +unpack (a) a +unpack (.) nil +unpack (ab) a b +unpack (.b) nil b +unpack (a.) a nil +unpack (abc) a b c +unpack (.ab) nil a b +unpack (a.b) a nil b +unpack (ab.) a b nil +unpack (..b) nil nil b +unpack (a..) a nil nil +unpack (.b.) nil b nil +unpack (...) nil nil nil +pcall(unpack,t) true aa bb cc dd ee ff +pcall(unpack,t,2) true bb cc dd ee ff +pcall(unpack,t,2,5) true bb cc dd ee +pcall(unpack,t,2,6) true bb cc dd ee ff +pcall(unpack,t,2,7) true bb cc dd ee ff nil +pcall(unpack,t,1) true aa bb cc dd ee ff +pcall(unpack,t,1,5) true aa bb cc dd ee +pcall(unpack,t,1,6) true aa bb cc dd ee ff +pcall(unpack,t,1,7) true aa bb cc dd ee ff nil +pcall(unpack,t,0) true nil aa bb cc dd ee ff +pcall(unpack,t,0,5) true nil aa bb cc dd ee +pcall(unpack,t,0,6) true nil aa bb cc dd ee ff +pcall(unpack,t,0,7) true nil aa bb cc dd ee ff nil +pcall(unpack,t,-1) true nil nil aa bb cc dd ee ff +pcall(unpack,t,-1,5) true nil nil aa bb cc dd ee +pcall(unpack,t,-1,6) true nil nil aa bb cc dd ee ff +pcall(unpack,t,-1,7) true nil nil aa bb cc dd ee ff nil +pcall(unpack,t,2,4) true bb cc dd +pcall(unpack,t,2,5) true bb cc dd ee +pcall(unpack,t,2,6) true bb cc dd ee ff +pcall(unpack,t,2,7) true bb cc dd ee ff nil +pcall(unpack,t,2,8) true bb cc dd ee ff nil nil +pcall(unpack,t,2,2) true +pcall(unpack,t,2,1) true +pcall(unpack,t,2,0) true +pcall(unpack,t,2,-1) true +pcall(unpack,t,0) true zz aa bb cc dd ee ff +pcall(unpack,t,2,0) true +pcall(unpack,t,2,-1) true +pcall(unpack,t,"3") true cc dd ee ff +pcall(unpack,t,"a") false +pcall(unpack,t,function() end) false +----- misc table initializer tests ------- +3 +4 +4 +----- basic table operations ------- +------ basic table tests on basic table table +t[1]=2 true +t[1] true 2 +t[1]=nil true +t[1] true nil +t["a"]="b" true +t["a"],t.a true b b +t.a="c" true +t["a"],t.a true c c +t.a=nil true +t["a"],t.a true nil nil +t[nil]="d" false string +t[nil] true nil +t[nil]=nil false string +t[nil] true nil +------ basic table tests on function metatable on __index table +t[1]=2 true +t[1] true 2 +t[1]=nil true +metatable call args table 1 +t[1] true dummy +t["a"]="b" true +t["a"],t.a true b b +t.a="c" true +t["a"],t.a true c c +t.a=nil true +metatable call args table a +metatable call args table a +t["a"],t.a true dummy dummy +t[nil]="d" false string +metatable call args table nil +t[nil] true dummy +t[nil]=nil false string +metatable call args table nil +t[nil] true dummy +------ basic table tests on function metatable on __newindex table +metatable call args table 1 2 +t[1]=2 true +t[1] true nil +metatable call args table 1 nil +t[1]=nil true +t[1] true nil +metatable call args table a b +t["a"]="b" true +t["a"],t.a true nil nil +metatable call args table a c +t.a="c" true +t["a"],t.a true nil nil +metatable call args table a nil +t.a=nil true +t["a"],t.a true nil nil +metatable call args table nil d +t[nil]="d" true nil +t[nil] true nil +metatable call args table nil nil +t[nil]=nil true nil +t[nil] true nil +------ basic table tests on plain metatable on __index table +t[1]=2 true +t[1] true 2 +t[1]=nil true +t[1] true nil +t["a"]="b" true +t["a"],t.a true b b +t.a="c" true +t["a"],t.a true c c +t.a=nil true +t["a"],t.a true nil nil +t[nil]="d" false string +t[nil] true nil +t[nil]=nil false string +t[nil] true nil +------ basic table tests on plain metatable on __newindex table +t[1]=2 true +t[1] true 2 +t[1]=nil true +t[1] true nil +t["a"]="b" true +t["a"],t.a true b b +t.a="c" true +t["a"],t.a true c c +t.a=nil true +t["a"],t.a true nil nil +t[nil]="d" false string +t[nil] true nil +t[nil]=nil false string +t[nil] true nil +-- sort tests +default (lexical) comparator +2-4-6-8-1-3-5-7 +1-2-3-4-5-6-7-8 +333-222-111 +111-222-333 +www-xxx-yyy-aaa-bbb-ccc +aaa-bbb-ccc-www-xxx-yyy +21-23-25-27-22-24-26-28 +sort failed +custom (numerical) comparator +2-4-6-8-1-3-5-7 +1-2-3-4-5-6-7-8 +333-222-111 +111-222-333 +www-xxx-yyy-aaa-bbb-ccc +sort failed +21-23-25-27-22-24-26-28 +21-22-23-24-25-26-27-28 diff --git a/luaj-test/src/test/resources/tailcalls.lua b/luaj-test/src/test/resources/compatibility/tailcalls.lua similarity index 100% rename from luaj-test/src/test/resources/tailcalls.lua rename to luaj-test/src/test/resources/compatibility/tailcalls.lua diff --git a/luaj-test/src/test/resources/compatibility/tailcalls.out b/luaj-test/src/test/resources/compatibility/tailcalls.out new file mode 100644 index 00000000..3f30692c --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/tailcalls.out @@ -0,0 +1,211 @@ +true true +b +true true +true true c +--f, n, table.unpack(t) func.1 0 +true 0 0 0 +--f, n, table.unpack(t) func.1 0 1 +true 1 1 1 +--f, n, table.unpack(t) func.1 0 1 2 +true 1 3 3 +--f, n, table.unpack(t) func.1 0 1 2 3 +true 1 3 6 +--f, n, table.unpack(t) func.1 0 1 2 3 4 +true 1 3 6 +--f, n, table.unpack(t) func.1 1 +true 0 0 0 +--f, n, table.unpack(t) func.1 1 1 +true 1 2 3 +--f, n, table.unpack(t) func.1 1 1 2 +true 1 4 7 +--f, n, table.unpack(t) func.1 1 1 2 3 +true 1 4 10 +--f, n, table.unpack(t) func.1 1 1 2 3 4 +true 1 4 10 +--f, n, table.unpack(t) func.1 2 +true 0 0 0 +--f, n, table.unpack(t) func.1 2 1 +true 1 3 6 +--f, n, table.unpack(t) func.1 2 1 2 +true 1 5 12 +--f, n, table.unpack(t) func.1 2 1 2 3 +true 1 5 15 +--f, n, table.unpack(t) func.1 2 1 2 3 4 +true 1 5 15 +--f, n, table.unpack(t) func.1 3 +true 0 0 0 +--f, n, table.unpack(t) func.1 3 1 +true 1 4 10 +--f, n, table.unpack(t) func.1 3 1 2 +true 1 6 18 +--f, n, table.unpack(t) func.1 3 1 2 3 +true 1 6 21 +--f, n, table.unpack(t) func.1 3 1 2 3 4 +true 1 6 21 +--f, n, table.unpack(t) func.2 0 + --f2, n<=0, returning sum(...) +true 0 +--f, n, table.unpack(t) func.2 0 1 + --f2, n<=0, returning sum(...) 1 +true 1 +--f, n, table.unpack(t) func.2 0 1 2 + --f2, n<=0, returning sum(...) 1 2 +true 3 +--f, n, table.unpack(t) func.2 0 1 2 3 + --f2, n<=0, returning sum(...) 1 2 3 +true 6 +--f, n, table.unpack(t) func.2 0 1 2 3 4 + --f2, n<=0, returning sum(...) 1 2 3 4 +true 10 +--f, n, table.unpack(t) func.2 1 + --f2, n>0, returning f2(n-1,n,...) 0 1 + --f2, n<=0, returning sum(...) 1 +true 1 +--f, n, table.unpack(t) func.2 1 1 + --f2, n>0, returning f2(n-1,n,...) 0 1 1 + --f2, n<=0, returning sum(...) 1 1 +true 2 +--f, n, table.unpack(t) func.2 1 1 2 + --f2, n>0, returning f2(n-1,n,...) 0 1 1 2 + --f2, n<=0, returning sum(...) 1 1 2 +true 4 +--f, n, table.unpack(t) func.2 1 1 2 3 + --f2, n>0, returning f2(n-1,n,...) 0 1 1 2 3 + --f2, n<=0, returning sum(...) 1 1 2 3 +true 7 +--f, n, table.unpack(t) func.2 1 1 2 3 4 + --f2, n>0, returning f2(n-1,n,...) 0 1 1 2 3 4 + --f2, n<=0, returning sum(...) 1 1 2 3 4 +true 11 +--f, n, table.unpack(t) func.2 2 + --f2, n>0, returning f2(n-1,n,...) 1 2 + --f2, n>0, returning f2(n-1,n,...) 0 1 2 + --f2, n<=0, returning sum(...) 1 2 +true 3 +--f, n, table.unpack(t) func.2 2 1 + --f2, n>0, returning f2(n-1,n,...) 1 2 1 + --f2, n>0, returning f2(n-1,n,...) 0 1 2 1 + --f2, n<=0, returning sum(...) 1 2 1 +true 4 +--f, n, table.unpack(t) func.2 2 1 2 + --f2, n>0, returning f2(n-1,n,...) 1 2 1 2 + --f2, n>0, returning f2(n-1,n,...) 0 1 2 1 2 + --f2, n<=0, returning sum(...) 1 2 1 2 +true 6 +--f, n, table.unpack(t) func.2 2 1 2 3 + --f2, n>0, returning f2(n-1,n,...) 1 2 1 2 3 + --f2, n>0, returning f2(n-1,n,...) 0 1 2 1 2 3 + --f2, n<=0, returning sum(...) 1 2 1 2 3 +true 9 +--f, n, table.unpack(t) func.2 2 1 2 3 4 + --f2, n>0, returning f2(n-1,n,...) 1 2 1 2 3 4 + --f2, n>0, returning f2(n-1,n,...) 0 1 2 1 2 3 4 + --f2, n<=0, returning sum(...) 1 2 1 2 3 4 +true 13 +--f, n, table.unpack(t) func.2 3 + --f2, n>0, returning f2(n-1,n,...) 2 3 + --f2, n>0, returning f2(n-1,n,...) 1 2 3 + --f2, n>0, returning f2(n-1,n,...) 0 1 2 3 + --f2, n<=0, returning sum(...) 1 2 3 +true 6 +--f, n, table.unpack(t) func.2 3 1 + --f2, n>0, returning f2(n-1,n,...) 2 3 1 + --f2, n>0, returning f2(n-1,n,...) 1 2 3 1 + --f2, n>0, returning f2(n-1,n,...) 0 1 2 3 1 + --f2, n<=0, returning sum(...) 1 2 3 1 +true 7 +--f, n, table.unpack(t) func.2 3 1 2 + --f2, n>0, returning f2(n-1,n,...) 2 3 1 2 + --f2, n>0, returning f2(n-1,n,...) 1 2 3 1 2 + --f2, n>0, returning f2(n-1,n,...) 0 1 2 3 1 2 + --f2, n<=0, returning sum(...) 1 2 3 1 2 +true 9 +--f, n, table.unpack(t) func.2 3 1 2 3 + --f2, n>0, returning f2(n-1,n,...) 2 3 1 2 3 + --f2, n>0, returning f2(n-1,n,...) 1 2 3 1 2 3 + --f2, n>0, returning f2(n-1,n,...) 0 1 2 3 1 2 3 + --f2, n<=0, returning sum(...) 1 2 3 1 2 3 +true 12 +--f, n, table.unpack(t) func.2 3 1 2 3 4 + --f2, n>0, returning f2(n-1,n,...) 2 3 1 2 3 4 + --f2, n>0, returning f2(n-1,n,...) 1 2 3 1 2 3 4 + --f2, n>0, returning f2(n-1,n,...) 0 1 2 3 1 2 3 4 + --f2, n<=0, returning sum(...) 1 2 3 1 2 3 4 +true 16 +--f, n, table.unpack(t) func.3 0 +true 0 +--f, n, table.unpack(t) func.3 0 1 +true 1 +--f, n, table.unpack(t) func.3 0 1 2 +true 3 +--f, n, table.unpack(t) func.3 0 1 2 3 +true 6 +--f, n, table.unpack(t) func.3 0 1 2 3 4 +true 10 +--f, n, table.unpack(t) func.3 1 + f3,n-1,n,... func.3 0 1 +true true 1 +--f, n, table.unpack(t) func.3 1 1 + f3,n-1,n,... func.3 0 1 1 +true true 2 +--f, n, table.unpack(t) func.3 1 1 2 + f3,n-1,n,... func.3 0 1 1 2 +true true 4 +--f, n, table.unpack(t) func.3 1 1 2 3 + f3,n-1,n,... func.3 0 1 1 2 3 +true true 7 +--f, n, table.unpack(t) func.3 1 1 2 3 4 + f3,n-1,n,... func.3 0 1 1 2 3 4 +true true 11 +--f, n, table.unpack(t) func.3 2 + f3,n-1,n,... func.3 1 2 + f3,n-1,n,... func.3 0 1 2 +true true true 3 +--f, n, table.unpack(t) func.3 2 1 + f3,n-1,n,... func.3 1 2 1 + f3,n-1,n,... func.3 0 1 2 1 +true true true 4 +--f, n, table.unpack(t) func.3 2 1 2 + f3,n-1,n,... func.3 1 2 1 2 + f3,n-1,n,... func.3 0 1 2 1 2 +true true true 6 +--f, n, table.unpack(t) func.3 2 1 2 3 + f3,n-1,n,... func.3 1 2 1 2 3 + f3,n-1,n,... func.3 0 1 2 1 2 3 +true true true 9 +--f, n, table.unpack(t) func.3 2 1 2 3 4 + f3,n-1,n,... func.3 1 2 1 2 3 4 + f3,n-1,n,... func.3 0 1 2 1 2 3 4 +true true true 13 +--f, n, table.unpack(t) func.3 3 + f3,n-1,n,... func.3 2 3 + f3,n-1,n,... func.3 1 2 3 + f3,n-1,n,... func.3 0 1 2 3 +true true true true 6 +--f, n, table.unpack(t) func.3 3 1 + f3,n-1,n,... func.3 2 3 1 + f3,n-1,n,... func.3 1 2 3 1 + f3,n-1,n,... func.3 0 1 2 3 1 +true true true true 7 +--f, n, table.unpack(t) func.3 3 1 2 + f3,n-1,n,... func.3 2 3 1 2 + f3,n-1,n,... func.3 1 2 3 1 2 + f3,n-1,n,... func.3 0 1 2 3 1 2 +true true true true 9 +--f, n, table.unpack(t) func.3 3 1 2 3 + f3,n-1,n,... func.3 2 3 1 2 3 + f3,n-1,n,... func.3 1 2 3 1 2 3 + f3,n-1,n,... func.3 0 1 2 3 1 2 3 +true true true true 12 +--f, n, table.unpack(t) func.3 3 1 2 3 4 + f3,n-1,n,... func.3 2 3 1 2 3 4 + f3,n-1,n,... func.3 1 2 3 1 2 3 4 + f3,n-1,n,... func.3 0 1 2 3 1 2 3 4 +true true true true 16 +120 +120 +1234 +true 832040 +true 832040 +true inf +1 1 2 3 5 8 13 21 34 diff --git a/luaj-test/src/test/resources/upvalues.lua b/luaj-test/src/test/resources/compatibility/upvalues.lua similarity index 100% rename from luaj-test/src/test/resources/upvalues.lua rename to luaj-test/src/test/resources/compatibility/upvalues.lua diff --git a/luaj-test/src/test/resources/compatibility/upvalues.out b/luaj-test/src/test/resources/compatibility/upvalues.out new file mode 100644 index 00000000..c9260f54 --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/upvalues.out @@ -0,0 +1,23 @@ +-------- simple upvalues tests -------- +6 +5 +f1()= 6 +g1()= 5 +6 +5 +f2()= 6 +g2()= 5 +g1()= 4 +f1()= 5 +simplevalues result: true +----------- upvalued in middle ------------ +x= 3 +y= 5 +z= 7 +x= x +y= y +z= z +true +--------- nested upvalues ---------- +10 20 +nestedupvaluestest result: true diff --git a/luaj-test/src/test/resources/vm.lua b/luaj-test/src/test/resources/compatibility/vm.lua similarity index 100% rename from luaj-test/src/test/resources/vm.lua rename to luaj-test/src/test/resources/compatibility/vm.lua diff --git a/luaj-test/src/test/resources/compatibility/vm.out b/luaj-test/src/test/resources/compatibility/vm.out new file mode 100644 index 00000000..79f74754 --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/vm.out @@ -0,0 +1,418 @@ +-------- basic vm tests -------- +-- boolean tests +true +false +false +true +true +false +false +true +true +false +false +true +false +true +1 +0 +nil +1 +0 +nil +booleantests result: true +------------- varargs +---- function p() +--p(): +a nil +... +...,a nil nil +a,... nil + -> true +--p("q"): +a q +... +...,a nil q +a,... q + -> true +--p("q","r"): +a q +... r +...,a r q +a,... q r + -> true +--p("q","r","s"): +a q +... r s +...,a r q +a,... q r s + -> true +---- function q() +--q(): +a,arg[1],arg[2],arg[3] nil nil global-1 global-2 global-3 + -> true +--q("q"): +a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3 + -> true +--q("q","r"): +a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3 + -> true +--q("q","r","s"): +a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3 + -> true +---- function r() +--r(): +a,arg[1],arg[2],arg[3] nil nil global-1 global-2 global-3 +a nil +... +...,a nil nil +a,... nil + -> true +--r("q"): +a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3 +a q +... +...,a nil q +a,... q + -> true +--r("q","r"): +a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3 +a q +... r +...,a r q +a,... q r + -> true +--r("q","r","s"): +a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3 +a q +... r s +...,a r q +a,... q r s + -> true +---- function s() +--s(): +a,arg[1],arg[2],arg[3] nil 1 2 3 +a nil + -> true +--s("q"): +a,arg[1],arg[2],arg[3] q 1 2 3 +a q + -> true +--s("q","r"): +a,arg[1],arg[2],arg[3] q 1 2 3 +a q + -> true +--s("q","r","s"): +a,arg[1],arg[2],arg[3] q 1 2 3 +a q + -> true +---- function t() +--t(): +a,arg[1],arg[2],arg[3] nil 1 2 3 +a nil +... +...,a nil nil +a,... nil + -> true +--t("q"): +a,arg[1],arg[2],arg[3] q 1 2 3 +a q +... +...,a nil q +a,... q + -> true +--t("q","r"): +a,arg[1],arg[2],arg[3] q 1 2 3 +a q +... r +...,a r q +a,... q r + -> true +--t("q","r","s"): +a,arg[1],arg[2],arg[3] q 1 2 3 +a q +... r s +...,a r q +a,... q r s + -> true +---- function u() +--u(): +arg nil + -> true +--u("q"): +arg q + -> true +--u("q","r"): +arg q + -> true +--u("q","r","s"): +arg q + -> true +---- function v() +--v(): +arg nil +... +arg,... nil + -> true +--v("q"): +arg q +... +arg,... q + -> true +--v("q","r"): +arg q +... r +arg,... q r + -> true +--v("q","r","s"): +arg q +... r s +arg,... q r s + -> true +varargstest result: true +---------- metatable tests +ell +set{} tbl.1 tbl.2 tbl.1 nil +set-nil tbl.1 nil tbl.1 nil +set{} tbl.1 tbl.3 tbl.1 nil +set tbl.1 tbl.3 false string +set{} tbl.1 tbl.4 tbl.1 nil +set{} tbl.1 tbl.5 tbl.1 nil +set{}{} tbl.1 tbl.6 tbl.1 nil +set-nil tbl.1 nil tbl.1 nil +set{__} tbl.1 tbl.7 tbl.1 nil +set{} tbl.1 tbl.7 false string +set-nil tbl.1 tbl.7 false string +set{} tbl.8 tbl.9 tbl.8 nil +set-nil tbl.8 nil tbl.8 nil +set{__} tbl.8 abc tbl.8 nil +set{} tbl.8 abc false string +set-nil tbl.8 abc false string +t.a 1234 +t.b 1235 +t.a 1234 +t.b 1235 +t.c 1236 +t.a 1234 +t.b 1235 +t.c 1236 +t.d 1237 +metatabletests result: true +------------ huge tables +#t= 100 t[1,50,51,59] 1 1 1 1 +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +#t2= 70 t[1,50,51,59] 1 1 1 1 +0,3,4,7,9,8,12,15,23,5,10,13,14,17,19,18,112,115,123,15,20,33,24,27,29,28,212,215,223,25,40,43,44,47,49,48,412,415,423,45,50,53,54,57,59,58,512,515,523,55,60,63,64,67,69,68,612,615,623,65,70,73,74,77,79,78,72,715,723,75 +t[2000] a +t[2001] b +t[2002] c +t[2003] d +t[2004] e +t[2005] f +t[2006] g +t[2007] h +t[2008] i +t[2009] j +t[3000] a +t[3001] b +t[3002] c +t[3003] d +t[3004] e +t[3005] f +t[3006] g +t[3007] h +t[3008] i +t[3009] j +t[4000] a +t[4001] b +t[4002] c +t[4003] d +t[4004] e +t[4005] f +t[4006] g +t[4007] h +t[4008] i +t[4009] j +t[5000] a +t[5001] b +t[5002] c +t[5003] d +t[5004] e +t[5005] f +t[5006] g +t[5007] h +t[5008] i +t[5009] j +t[6000] a +t[6001] b +t[6002] c +t[6003] d +t[6004] e +t[6005] f +t[6006] g +t[6007] h +t[6008] i +t[6009] j +t[7000] a +t[7001] b +t[7002] c +t[7003] d +t[7004] e +t[7005] f +t[7006] g +t[7007] h +t[7008] i +t[7009] j +t[8000] a +t[8001] b +t[8002] c +t[8003] d +t[8004] e +t[8005] f +t[8006] g +t[8007] h +t[8008] i +t[8009] j +hugetables result: true +--------- many locals +a a +b b +c c +d d +e e +f f +g g +h h +i i +j j +a a +b b +c c +d d +e e +f f +g g +h h +i i +j j +a a +b b +c c +d d +e e +f f +g g +h h +i i +j j +a a +b b +c c +d d +e e +f f +g g +h h +i i +j j +a a +b b +c c +d d +e e +f f +g g +h h +i i +j j +a a +b b +c c +d d +e e +f f +g g +h h +i i +j j +a a +b b +c c +d d +e e +f f +g g +h h +i i +j j +a a +b b +c c +d d +e e +f f +g g +h h +i i +j j +a a +b b +c c +d d +e e +f f +g g +h h +i i +j j +a a +b b +c c +d d +e e +f f +g g +h h +i i +j j +a a +b b +c c +d d +e e +f f +g g +h h +i i +j j +a a +b b +c c +d d +e e +f f +g g +h h +i i +j j +a a +b b +c c +d d +e e +f f +g g +h h +i i +j j +a a +b b +c c +d d +e e +f f +g g +h h +i i +j j +manylocals result: true diff --git a/luaj-test/src/test/resources/errors/abc.txt b/luaj-test/src/test/resources/errors/args.out similarity index 100% rename from luaj-test/src/test/resources/errors/abc.txt rename to luaj-test/src/test/resources/errors/args.out diff --git a/luaj-test/src/test/resources/errors/baselibargs.out b/luaj-test/src/test/resources/errors/baselibargs.out new file mode 100644 index 00000000..102fe749 --- /dev/null +++ b/luaj-test/src/test/resources/errors/baselibargs.out @@ -0,0 +1,530 @@ +====== assert ====== +--- checkallpass +- assert(true,nil) true +- assert(123,nil) 123 +- assert(true,'abc') true,'abc' +- assert(123,'abc') 123,'abc' +- assert(true,1.25) true,1.25 +- assert(123,1.25) 123,1.25 +- assert(true,true) true,true +- assert(123,true) 123,true +- assert(true,) true,
+- assert(123,
) 123,
+- assert(true,) true, +- assert(123,) 123, +- assert(true,) true, +- assert(123,) 123, +--- checkallerrors +- assert(nil,nil) ...assertion failed... +- assert(false,nil) ...assertion failed... +--- checkallerrors +- assert(nil,'message') ...message... +- assert(false,'message') ...message... +====== collectgarbage ====== +--- checkallpass +- collectgarbage('collect') number +- collectgarbage('count') number,number +--- checkallerrors +- collectgarbage('abc') ...bad argument... +- collectgarbage(1.25) ...bad argument... +--- checkallerrors +- collectgarbage(true) ...string expected... +- collectgarbage(
) ...string expected... +- collectgarbage() ...string expected... +- collectgarbage() ...string expected... +====== dofile ====== +====== error ====== +====== getmetatable ====== +--- checkallpass +- getmetatable('abc')
+- getmetatable(1.25) +- getmetatable(true) +- getmetatable(
) +- getmetatable() +- getmetatable() +--- checkallerrors +- getmetatable() ...bad argument... +====== ipairs ====== +--- checkallpass +- ipairs(
) ,
,0 +--- checkallerrors +- ipairs(nil) ...bad argument... +- ipairs('abc') ...bad argument... +- ipairs(1.25) ...bad argument... +- ipairs(true) ...bad argument... +- ipairs() ...bad argument... +- ipairs() ...bad argument... +====== load ====== +--- checkallpass +- load(,nil) +- load(,'abc') +--- checkallerrors +- load(nil,nil) ...bad argument... +needcheck load('abc',nil) nil +needcheck load(1.25,nil) nil +- load(true,nil) ...bad argument... +- load(
,nil) ...bad argument... +- load(,nil) ...bad argument... +- load(nil,'abc') ...bad argument... +needcheck load('abc','abc') nil +needcheck load(1.25,'abc') nil +- load(true,'abc') ...bad argument... +- load(
,'abc') ...bad argument... +- load(,'abc') ...bad argument... +- load(nil,1.25) ...bad argument... +needcheck load('abc',1.25) nil +needcheck load(1.25,1.25) nil +- load(true,1.25) ...bad argument... +- load(
,1.25) ...bad argument... +- load(,1.25) ...bad argument... +--- checkallerrors +- load(,) ...bad argument... +- load(,
) ...bad argument... +====== loadfile ====== +====== load ====== +--- checkallpass +- load('return') +--- checkallpass +- load('return','mychunk') +--- checkallpass +- load('return a ... b','mychunk') nil,string +--- checkallerrors +- load(nil,nil) ...bad argument... +- load(true,nil) ...bad argument... +- load(
,nil) ...bad argument... +needcheck load(,nil) function: 0x10011ba00 +- load(,nil) ...bad argument... +- load(nil,'abc') ...bad argument... +- load(true,'abc') ...bad argument... +- load(
,'abc') ...bad argument... +needcheck load(,'abc') function: 0x10011c780 +- load(,'abc') ...bad argument... +- load(nil,1.25) ...bad argument... +- load(true,1.25) ...bad argument... +- load(
,1.25) ...bad argument... +needcheck load(,1.25) function: 0x10011d560 +- load(,1.25) ...bad argument... +--- checkallerrors +- load('return',) ...bad argument... +- load('return',
) ...bad argument... +====== next ====== +--- checkallpass +- next(
,'aa') +--- checkallerrors +- next(nil,nil) ...bad argument... +- next('abc',nil) ...bad argument... +- next(1.25,nil) ...bad argument... +- next(true,nil) ...bad argument... +- next(,nil) ...bad argument... +- next(,nil) ...bad argument... +- next(nil,1) ...bad argument... +- next('abc',1) ...bad argument... +- next(1.25,1) ...bad argument... +- next(true,1) ...bad argument... +- next(,1) ...bad argument... +- next(,1) ...bad argument... +--- checkallerrors +- next(
,'abc') ...invalid key... +- next(
,1.25) ...invalid key... +- next(
,true) ...invalid key... +- next(
,
) ...invalid key... +- next(
,) ...invalid key... +====== pairs ====== +--- checkallpass +- pairs(
) ,
+--- checkallerrors +- pairs(nil) ...bad argument... +- pairs('abc') ...bad argument... +- pairs(1.25) ...bad argument... +- pairs(true) ...bad argument... +- pairs() ...bad argument... +- pairs() ...bad argument... +====== pcall ====== +--- checkallpass +- pcall('abc',nil) boolean,string +- pcall(1.25,nil) boolean,string +- pcall(true,nil) boolean,string +- pcall(
,nil) boolean,string +- pcall(,nil) boolean +- pcall(,nil) boolean,string +- pcall('abc','abc') boolean,string +- pcall(1.25,'abc') boolean,string +- pcall(true,'abc') boolean,string +- pcall(
,'abc') boolean,string +- pcall(,'abc') boolean +- pcall(,'abc') boolean,string +- pcall('abc',1.25) boolean,string +- pcall(1.25,1.25) boolean,string +- pcall(true,1.25) boolean,string +- pcall(
,1.25) boolean,string +- pcall(,1.25) boolean +- pcall(,1.25) boolean,string +- pcall('abc',true) boolean,string +- pcall(1.25,true) boolean,string +- pcall(true,true) boolean,string +- pcall(
,true) boolean,string +- pcall(,true) boolean +- pcall(,true) boolean,string +- pcall('abc',
) boolean,string +- pcall(1.25,
) boolean,string +- pcall(true,
) boolean,string +- pcall(
,
) boolean,string +- pcall(,
) boolean +- pcall(,
) boolean,string +- pcall('abc',) boolean,string +- pcall(1.25,) boolean,string +- pcall(true,) boolean,string +- pcall(
,) boolean,string +- pcall(,) boolean +- pcall(,) boolean,string +- pcall('abc',) boolean,string +- pcall(1.25,) boolean,string +- pcall(true,) boolean,string +- pcall(
,) boolean,string +- pcall(,) boolean +- pcall(,) boolean,string +--- checkallerrors +- pcall() ...bad argument... +====== print ====== +--- checkallpass + +- print() +--- checkallpass +nil +- print(nil) +abc +- print('abc') +1.25 +- print(1.25) +true +- print(true) +====== rawequal ====== +--- checkallpass +- rawequal('abc','abc') true +- rawequal(1.25,'abc') false +- rawequal(true,'abc') false +- rawequal(
,'abc') false +- rawequal(,'abc') false +- rawequal(,'abc') false +- rawequal('abc',1.25) false +- rawequal(1.25,1.25) true +- rawequal(true,1.25) false +- rawequal(
,1.25) false +- rawequal(,1.25) false +- rawequal(,1.25) false +- rawequal('abc',true) false +- rawequal(1.25,true) false +- rawequal(true,true) true +- rawequal(
,true) false +- rawequal(,true) false +- rawequal(,true) false +- rawequal('abc',
) false +- rawequal(1.25,
) false +- rawequal(true,
) false +- rawequal(
,
) true +- rawequal(,
) false +- rawequal(,
) false +- rawequal('abc',) false +- rawequal(1.25,) false +- rawequal(true,) false +- rawequal(
,) false +- rawequal(,) true +- rawequal(,) false +- rawequal('abc',) false +- rawequal(1.25,) false +- rawequal(true,) false +- rawequal(
,) false +- rawequal(,) false +- rawequal(,) true +--- checkallerrors +- rawequal() ...bad argument... +--- checkallerrors +- rawequal('abc') ...bad argument... +- rawequal(1.25) ...bad argument... +- rawequal(true) ...bad argument... +- rawequal(
) ...bad argument... +- rawequal() ...bad argument... +- rawequal() ...bad argument... +====== rawget ====== +--- checkallpass +- rawget(
,'aa') 456 +--- checkallpass +- rawget(
,'abc') +- rawget(
,1.25) +- rawget(
,true) +- rawget(
,
) +- rawget(
,) +--- checkallerrors +--- checkallerrors +- rawget(nil,'abc') ...bad argument... +- rawget('abc','abc') ...bad argument... +- rawget(1.25,'abc') ...bad argument... +- rawget(true,'abc') ...bad argument... +- rawget(,'abc') ...bad argument... +- rawget(,'abc') ...bad argument... +- rawget(nil,1.25) ...bad argument... +- rawget('abc',1.25) ...bad argument... +- rawget(1.25,1.25) ...bad argument... +- rawget(true,1.25) ...bad argument... +- rawget(,1.25) ...bad argument... +- rawget(,1.25) ...bad argument... +- rawget(nil,true) ...bad argument... +- rawget('abc',true) ...bad argument... +- rawget(1.25,true) ...bad argument... +- rawget(true,true) ...bad argument... +- rawget(,true) ...bad argument... +- rawget(,true) ...bad argument... +- rawget(nil,
) ...bad argument... +- rawget('abc',
) ...bad argument... +- rawget(1.25,
) ...bad argument... +- rawget(true,
) ...bad argument... +- rawget(,
) ...bad argument... +- rawget(,
) ...bad argument... +- rawget(nil,) ...bad argument... +- rawget('abc',) ...bad argument... +- rawget(1.25,) ...bad argument... +- rawget(true,) ...bad argument... +- rawget(,) ...bad argument... +- rawget(,) ...bad argument... +--- checkallerrors +- rawget() ...bad argument... +====== rawset ====== +--- checkallpass +- rawset(
,'aa','abc')
+- rawset(
,'aa',1.25)
+- rawset(
,'aa',true)
+- rawset(
,'aa',
)
+- rawset(
,'aa',)
+- rawset(
,'aa',)
+--- checkallpass +- rawset(
,'abc','abc')
+- rawset(
,1.25,'abc')
+- rawset(
,true,'abc')
+- rawset(
,
,'abc')
+- rawset(
,,'abc')
+- rawset(
,'abc',1.25)
+- rawset(
,1.25,1.25)
+- rawset(
,true,1.25)
+- rawset(
,
,1.25)
+- rawset(
,,1.25)
+- rawset(
,'abc',true)
+- rawset(
,1.25,true)
+- rawset(
,true,true)
+- rawset(
,
,true)
+- rawset(
,,true)
+- rawset(
,'abc',
)
+- rawset(
,1.25,
)
+- rawset(
,true,
)
+- rawset(
,
,
)
+- rawset(
,,
)
+- rawset(
,'abc',)
+- rawset(
,1.25,)
+- rawset(
,true,)
+- rawset(
,
,)
+- rawset(
,,)
+- rawset(
,'abc',)
+- rawset(
,1.25,)
+- rawset(
,true,)
+- rawset(
,
,)
+- rawset(
,,)
+--- checkallerrors +--- checkallerrors +- rawset() ...bad argument... +--- checkallerrors +- rawset(nil,'abc','abc') ...bad argument... +- rawset('abc','abc','abc') ...bad argument... +- rawset(1.25,'abc','abc') ...bad argument... +- rawset(true,'abc','abc') ...bad argument... +- rawset(,'abc','abc') ...bad argument... +- rawset(,'abc','abc') ...bad argument... +- rawset(nil,1.25,'abc') ...bad argument... +- rawset('abc',1.25,'abc') ...bad argument... +- rawset(1.25,1.25,'abc') ...bad argument... +- rawset(true,1.25,'abc') ...bad argument... +- rawset(,1.25,'abc') ...bad argument... +- rawset(,1.25,'abc') ...bad argument... +- rawset(nil,'abc',1.25) ...bad argument... +- rawset('abc','abc',1.25) ...bad argument... +- rawset(1.25,'abc',1.25) ...bad argument... +- rawset(true,'abc',1.25) ...bad argument... +- rawset(,'abc',1.25) ...bad argument... +- rawset(,'abc',1.25) ...bad argument... +- rawset(nil,1.25,1.25) ...bad argument... +- rawset('abc',1.25,1.25) ...bad argument... +- rawset(1.25,1.25,1.25) ...bad argument... +- rawset(true,1.25,1.25) ...bad argument... +- rawset(,1.25,1.25) ...bad argument... +- rawset(,1.25,1.25) ...bad argument... +--- checkallerrors +- rawset(
,'aa') ...bad argument... +====== select ====== +--- checkallpass +- select(1.25,nil) +- select('#',nil) 1 +- select(1.25,'abc') 'abc' +- select('#','abc') 1 +- select(1.25,1.25) 1.25 +- select('#',1.25) 1 +- select(1.25,true) true +- select('#',true) 1 +- select(1.25,
)
+- select('#',
) 1 +- select(1.25,) +- select('#',) 1 +- select(1.25,) +- select('#',) 1 +--- checkallerrors +- select(nil) ...bad argument... +- select('abc') ...bad argument... +- select(true) ...bad argument... +- select(
) ...bad argument... +- select() ...bad argument... +- select() ...bad argument... +====== setmetatable ====== +--- checkallpass +- setmetatable(
,
)
+--- checkallpass +--- checkallerrors +- setmetatable(nil,
) ...bad argument... +- setmetatable('abc',
) ...bad argument... +- setmetatable(1.25,
) ...bad argument... +- setmetatable(true,
) ...bad argument... +- setmetatable(,
) ...bad argument... +- setmetatable(,
) ...bad argument... +--- checkallerrors +- setmetatable(
,'abc') ...bad argument... +- setmetatable(
,1.25) ...bad argument... +- setmetatable(
,true) ...bad argument... +- setmetatable(
,) ...bad argument... +- setmetatable(
,) ...bad argument... +====== tonumber ====== +--- checkallpass +- tonumber(1.25,nil) 1.25 +- tonumber('789',nil) 789 +- tonumber(1.25,2) +- tonumber('789',2) +- tonumber(1.25,10) +- tonumber('789',10) 789 +- tonumber(1.25,36) +- tonumber('789',36) 9369 +--- checkallpass +- tonumber('abc',nil) +- tonumber(1.25,nil) 1.25 +- tonumber(true,nil) +- tonumber(
,nil) +- tonumber(,nil) +- tonumber(,nil) +- tonumber('abc',10) +- tonumber(1.25,10) +fail tonumber(true,10) 'bad argument #1 to '_G.tonumber' (string expected, got boolean)' +fail tonumber(
,10) 'bad argument #1 to '_G.tonumber' (string expected, got table)' +fail tonumber(,10) 'bad argument #1 to '_G.tonumber' (string expected, got function)' +fail tonumber(,10) 'bad argument #1 to '_G.tonumber' (string expected, got thread)' +--- checkallerrors +- tonumber(nil,2) ...bad argument... +- tonumber(,2) ...bad argument... +- tonumber(
,2) ...bad argument... +- tonumber(nil,9) ...bad argument... +- tonumber(,9) ...bad argument... +- tonumber(
,9) ...bad argument... +- tonumber(nil,11) ...bad argument... +- tonumber(,11) ...bad argument... +- tonumber(
,11) ...bad argument... +- tonumber(nil,36) ...bad argument... +- tonumber(,36) ...bad argument... +- tonumber(
,36) ...bad argument... +--- checkallerrors +- tonumber(1.25,1) ...bad argument... +- tonumber('789',1) ...bad argument... +- tonumber(1.25,37) ...bad argument... +- tonumber('789',37) ...bad argument... +- tonumber(1.25,
) ...bad argument... +- tonumber('789',
) ...bad argument... +- tonumber(1.25,) ...bad argument... +- tonumber('789',) ...bad argument... +- tonumber(1.25,true) ...bad argument... +- tonumber('789',true) ...bad argument... +====== tostring ====== +--- checkallpass +- tostring('abc') 'abc' +- tostring(1.25) '1.25' +- tostring(true) 'true' +--- checkallpass +- tostring(
) string +- tostring() string +- tostring() string +--- checkallpass +- tostring('abc','anchor') 'abc' +- tostring(1.25,'anchor') '1.25' +- tostring(true,'anchor') 'true' +--- checkallpass +- tostring(
,'anchor') string +- tostring(,'anchor') string +- tostring(,'anchor') string +--- checkallerrors +- tostring() ...bad argument... +====== type ====== +--- checkallpass +- type('abc') 'string' +- type(1.25) 'number' +- type(true) 'boolean' +- type(
) 'table' +- type() 'function' +- type() 'thread' +--- checkallpass +- type(nil,'anchor') 'nil' +- type('abc','anchor') 'string' +- type(1.25,'anchor') 'number' +- type(true,'anchor') 'boolean' +- type(
,'anchor') 'table' +- type(,'anchor') 'function' +- type(,'anchor') 'thread' +--- checkallerrors +- type() ...bad argument... +====== xpcall ====== +--- checkallpass +- xpcall('abc','abc') false,'error in error handling' +- xpcall(1.25,'abc') false,'error in error handling' +- xpcall(true,'abc') false,'error in error handling' +- xpcall(
,'abc') false,'error in error handling' +- xpcall(,'abc') true +- xpcall(,'abc') false,'error in error handling' +- xpcall('abc',1.25) false,'error in error handling' +- xpcall(1.25,1.25) false,'error in error handling' +- xpcall(true,1.25) false,'error in error handling' +- xpcall(
,1.25) false,'error in error handling' +- xpcall(,1.25) true +- xpcall(,1.25) false,'error in error handling' +- xpcall('abc',true) false,'error in error handling' +- xpcall(1.25,true) false,'error in error handling' +- xpcall(true,true) false,'error in error handling' +- xpcall(
,true) false,'error in error handling' +- xpcall(,true) true +- xpcall(,true) false,'error in error handling' +- xpcall('abc',
) false,'error in error handling' +- xpcall(1.25,
) false,'error in error handling' +- xpcall(true,
) false,'error in error handling' +- xpcall(
,
) false,'error in error handling' +- xpcall(,
) true +- xpcall(,
) false,'error in error handling' +- xpcall('abc',) false,'error in error handling' +- xpcall(1.25,) false,'error in error handling' +- xpcall(true,) false,'error in error handling' +- xpcall(
,) false,'error in error handling' +- xpcall(,) true +- xpcall(,) false,'error in error handling' +--- checkallpass +- xpcall('abc',) false,'aaa' +- xpcall(1.25,) false,'aaa' +- xpcall(true,) false,'aaa' +- xpcall(
,) false,'aaa' +- xpcall(,) true +- xpcall(,) false,'aaa' +--- checkallerrors +- xpcall(nil) ...bad argument... +- xpcall('abc') ...bad argument... +- xpcall(1.25) ...bad argument... +- xpcall(true) ...bad argument... +- xpcall(
) ...bad argument... +- xpcall() ...bad argument... +- xpcall() ...bad argument... diff --git a/luaj-test/src/test/resources/errors/coroutinelibargs.out b/luaj-test/src/test/resources/errors/coroutinelibargs.out new file mode 100644 index 00000000..331997f2 --- /dev/null +++ b/luaj-test/src/test/resources/errors/coroutinelibargs.out @@ -0,0 +1,65 @@ +====== coroutine.create ====== +--- checkallpass +- coroutine.create() +--- checkallerrors +- coroutine.create(nil) ...bad argument... +- coroutine.create('abc') ...bad argument... +- coroutine.create(1.25) ...bad argument... +- coroutine.create(true) ...bad argument... +- coroutine.create(
) ...bad argument... +- coroutine.create() ...bad argument... +====== coroutine.resume ====== +--- checkallpass +- coroutine.resume(,nil) true +- coroutine.resume(,'abc') true +- coroutine.resume(,1.25) true +- coroutine.resume(,true) true +- coroutine.resume(,
) true +- coroutine.resume(,) true +- coroutine.resume(,) true +--- checkallerrors +- coroutine.resume(nil) ...bad argument... +- coroutine.resume('abc') ...bad argument... +- coroutine.resume(1.25) ...bad argument... +- coroutine.resume(true) ...bad argument... +- coroutine.resume(
) ...bad argument... +- coroutine.resume() ...bad argument... +====== coroutine.running ====== +--- checkallpass +- coroutine.running(nil) ,true +- coroutine.running('abc') ,true +- coroutine.running(1.25) ,true +- coroutine.running(true) ,true +- coroutine.running(
) ,true +- coroutine.running() ,true +- coroutine.running() ,true +====== coroutine.status ====== +--- checkallpass +- coroutine.status() 'suspended' +--- checkallerrors +- coroutine.status(nil) ...bad argument... +- coroutine.status('abc') ...bad argument... +- coroutine.status(1.25) ...bad argument... +- coroutine.status(true) ...bad argument... +- coroutine.status(
) ...bad argument... +- coroutine.status() ...bad argument... +====== coroutine.wrap ====== +--- checkallpass +- coroutine.wrap() +--- checkallerrors +- coroutine.wrap(nil) ...bad argument... +- coroutine.wrap('abc') ...bad argument... +- coroutine.wrap(1.25) ...bad argument... +- coroutine.wrap(true) ...bad argument... +- coroutine.wrap(
) ...bad argument... +- coroutine.wrap() ...bad argument... +====== coroutine.yield ====== +status suspended +true +status suspended +yield abc 1.25 +true abc 1.25 true +status suspended +yield abc 1.25 +false error within coroutine thread +status dead diff --git a/luaj-test/src/test/resources/errors/debuglibargs.out b/luaj-test/src/test/resources/errors/debuglibargs.out new file mode 100644 index 00000000..66698f0b --- /dev/null +++ b/luaj-test/src/test/resources/errors/debuglibargs.out @@ -0,0 +1,452 @@ +====== debug.debug - no tests ====== +====== debug.gethook ====== +--- checkallpass +- debug.gethook() nil,'',0 +====== debug.getinfo ====== +--- checkallpass +- debug.getinfo()
+- debug.getinfo(25) +- debug.getinfo('25') +--- checkallpass +- debug.getinfo()
+- debug.getinfo(25) +- debug.getinfo('25') +--- checkallpass +- debug.getinfo(,'')
+- debug.getinfo(25,'') +- debug.getinfo('25','') +- debug.getinfo(,'n')
+- debug.getinfo(25,'n') +- debug.getinfo('25','n') +- debug.getinfo(,'flnStu')
+- debug.getinfo(25,'flnStu') +- debug.getinfo('25','flnStu') +--- checkallpass +fail debug.getinfo('') 'bad argument #1 to 'debug.getinfo' (function or level expected)' +fail debug.getinfo('n') 'bad argument #1 to 'debug.getinfo' (function or level expected)' +fail debug.getinfo('flnStu') 'bad argument #1 to 'debug.getinfo' (function or level expected)' +--- checkallerrors +- debug.getinfo() ...function or level... +--- checkallerrors +- debug.getinfo(nil) ...function or level... +- debug.getinfo('abc') ...function or level... +- debug.getinfo(true) ...function or level... +- debug.getinfo() ...function or level... +--- checkallerrors +- debug.getinfo(,true) ...string expected... +- debug.getinfo(,
) ...string expected... +- debug.getinfo(,) ...string expected... +- debug.getinfo(,) ...string expected... +--- checkallerrors +- debug.getinfo(nil,) ...string expected... +- debug.getinfo('abc',) ...string expected... +- debug.getinfo(true,) ...string expected... +--- checkallerrors +- debug.getinfo('abc',,'abc') ...string expected... +- debug.getinfo(1.25,,'abc') ...string expected... +- debug.getinfo(true,,'abc') ...string expected... +- debug.getinfo(
,,'abc') ...string expected... +- debug.getinfo(,,'abc') ...string expected... +--- checkallerrors +badmsg debug.getinfo('qzQZ') template='invalid option' actual='bad argument #1 to 'debug.getinfo' (function or level expected)' +====== debug.getlocal ====== +f: x,y,a,b,p,q 1 2 nil nil p q +--- checkallpass +- debug.getlocal(,1) 'x' +- debug.getlocal(1,1) '(*temporary)' +- debug.getlocal(,'2') 'y' +- debug.getlocal(1,'2') +--- checkallpass +- debug.getlocal(,,1) 'x' +--- checkallerrors +- debug.getlocal() ...number expected... +--- checkallerrors +- debug.getlocal(,nil) ...number expected... +- debug.getlocal(25,nil) ...number expected... +- debug.getlocal('25',nil) ...number expected... +- debug.getlocal(,'abc') ...number expected... +- debug.getlocal(25,'abc') ...number expected... +- debug.getlocal('25','abc') ...number expected... +- debug.getlocal(,true) ...number expected... +- debug.getlocal(25,true) ...number expected... +- debug.getlocal('25',true) ...number expected... +- debug.getlocal(,
) ...number expected... +- debug.getlocal(25,
) ...number expected... +- debug.getlocal('25',
) ...number expected... +- debug.getlocal(,) ...number expected... +- debug.getlocal(25,) ...number expected... +- debug.getlocal('25',) ...number expected... +- debug.getlocal(,) ...number expected... +- debug.getlocal(25,) ...number expected... +- debug.getlocal('25',) ...number expected... +--- checkallerrors +- debug.getlocal(nil,1.25) ...number expected... +- debug.getlocal('abc',1.25) ...number expected... +- debug.getlocal(true,1.25) ...number expected... +- debug.getlocal(,1.25) ...number expected... +- debug.getlocal(nil,'789') ...number expected... +- debug.getlocal('abc','789') ...number expected... +- debug.getlocal(true,'789') ...number expected... +- debug.getlocal(,'789') ...number expected... +--- checkallerrors +- debug.getlocal(,) ...got no value... +- debug.getlocal(,25) ...got no value... +- debug.getlocal(,'25') ...got no value... +--- checkallerrors +- debug.getlocal('abc',,1) ...number expected... +- debug.getlocal(1.25,,1) ...number expected... +- debug.getlocal(true,,1) ...number expected... +- debug.getlocal(
,,1) ...number expected... +- debug.getlocal(,,1) ...number expected... +- debug.getlocal('abc',,'2') ...number expected... +- debug.getlocal(1.25,,'2') ...number expected... +- debug.getlocal(true,,'2') ...number expected... +- debug.getlocal(
,,'2') ...number expected... +- debug.getlocal(,,'2') ...number expected... +--- checkallerrors +- debug.getlocal(,100,1) ...level out of range... +====== debug.getmetatable ====== +--- checkallpass +- debug.getmetatable(nil) +- debug.getmetatable('abc')
+- debug.getmetatable(1.25) +- debug.getmetatable(true) +- debug.getmetatable(
) +- debug.getmetatable() +- debug.getmetatable() +--- checkallerrors +- debug.getmetatable() ...value expected... +====== debug.getregistry ====== +--- checkallpass +- debug.getregistry()
+--- checkallpass +- debug.getregistry(nil)
+- debug.getregistry('abc')
+- debug.getregistry(1.25)
+- debug.getregistry(true)
+- debug.getregistry(
)
+- debug.getregistry()
+- debug.getregistry()
+====== debug.getupvalue ====== +--- checkallpass +- debug.getupvalue(,1) '_ENV',
+- debug.getupvalue(,'2') 'p','p' +--- checkallerrors +- debug.getupvalue() ...number expected... +--- checkallerrors +- debug.getupvalue(nil,1) ...function expected... +- debug.getupvalue('abc',1) ...function expected... +- debug.getupvalue(1.25,1) ...function expected... +- debug.getupvalue(true,1) ...function expected... +- debug.getupvalue(
,1) ...function expected... +- debug.getupvalue(,1) ...function expected... +- debug.getupvalue(nil,'2') ...function expected... +- debug.getupvalue('abc','2') ...function expected... +- debug.getupvalue(1.25,'2') ...function expected... +- debug.getupvalue(true,'2') ...function expected... +- debug.getupvalue(
,'2') ...function expected... +- debug.getupvalue(,'2') ...function expected... +--- checkallerrors +- debug.getupvalue(,nil) ...number expected... +- debug.getupvalue(,'abc') ...number expected... +- debug.getupvalue(,true) ...number expected... +- debug.getupvalue(,
) ...number expected... +- debug.getupvalue(,) ...number expected... +- debug.getupvalue(,) ...number expected... +--- checkallpass +- debug.getuservalue() +--- checkallpass +- debug.getuservalue(nil) +- debug.getuservalue('abc') +- debug.getuservalue(1.25) +- debug.getuservalue(true) +- debug.getuservalue(
) +- debug.getuservalue() +- debug.getuservalue() +--- checkallpass +- debug.sethook() +--- checkallpass +--- checkallpass +- debug.sethook(,'cr') +- debug.sethook(,'l') +--- checkallpass +- debug.sethook(nil,,'cr') +- debug.sethook(,,'cr') +- debug.sethook(nil,,'l') +- debug.sethook(,,'l') +--- checkallerrors +- debug.sethook('abc') ...string expected... +- debug.sethook() ...string expected... +- debug.sethook(true) ...string expected... +--- checkallerrors +- debug.sethook('abc',nil,'cr') ...string expected... +- debug.sethook(,nil,'cr') ...string expected... +- debug.sethook(true,nil,'cr') ...string expected... +- debug.sethook('abc',,'cr') ...string expected... +- debug.sethook(,,'cr') ...string expected... +- debug.sethook(true,,'cr') ...string expected... +- debug.sethook('abc',nil,'l') ...string expected... +- debug.sethook(,nil,'l') ...string expected... +- debug.sethook(true,nil,'l') ...string expected... +- debug.sethook('abc',,'l') ...string expected... +- debug.sethook(,,'l') ...string expected... +- debug.sethook(true,,'l') ...string expected... +====== debug.setlocal ====== +f: x,y,a,b,p,q 1 2 nil nil p q +--- checkallpass +- debug.setlocal(1,1,nil) '(*temporary)' +- debug.setlocal(1,1,'foo') '(*temporary)' +f: x,y,a,b,p,q 1 2 1 2 p q +--- checkallpass +- debug.setlocal(,1,2,nil) +- debug.setlocal(,1,2,'bar') +f: x,y,a,b,p,q 1 2 1 2 p q +--- checkallerrors +- debug.setlocal() ...number expected... +--- checkallerrors +- debug.setlocal(1) ...value expected... +--- checkallerrors +- debug.setlocal(1,1) ...value expected... +--- checkallerrors +- debug.setlocal(,1,2) ...value expected... +--- checkallerrors +- debug.setlocal(
,1) ...number expected... +- debug.setlocal('abc',1) ...number expected... +--- checkallerrors +- debug.setlocal(1,'abc') ...value expected... +- debug.setlocal(1,true) ...value expected... +- debug.setlocal(1,
) ...value expected... +- debug.setlocal(1,) ...value expected... +- debug.setlocal(1,) ...value expected... +--- checkallerrors +- debug.setlocal(
,1,1,nil) ...number expected... +- debug.setlocal('abc',1,1,nil) ...number expected... +- debug.setlocal(
,1,1,'foo') ...number expected... +- debug.setlocal('abc',1,1,'foo') ...number expected... +--- checkallerrors +- debug.setlocal(10,1,'foo') ...level out of range... +====== debug.setmetatable ====== +--- checkallpass +- debug.setmetatable(nil,
) +- debug.setmetatable('abc',
) 'abc' +- debug.setmetatable(1.25,
) 1.25 +- debug.setmetatable(true,
) true +- debug.setmetatable(
,
)
+- debug.setmetatable(,
) +- debug.setmetatable(,
) +- debug.setmetatable(nil,nil) +- debug.setmetatable('abc',nil) 'abc' +- debug.setmetatable(1.25,nil) 1.25 +- debug.setmetatable(true,nil) true +- debug.setmetatable(
,nil)
+- debug.setmetatable(,nil) +- debug.setmetatable(,nil) +--- checkallerrors +- debug.setmetatable() ...nil or table... +--- checkallerrors +- debug.setmetatable(nil) ...nil or table... +- debug.setmetatable('abc') ...nil or table... +- debug.setmetatable(1.25) ...nil or table... +- debug.setmetatable(true) ...nil or table... +- debug.setmetatable(
) ...nil or table... +- debug.setmetatable() ...nil or table... +- debug.setmetatable() ...nil or table... +====== debug.setupvalue ====== +--- checkallpass +- debug.setupvalue(,2,nil) 'p' +- debug.setupvalue(,'3',nil) 'q' +- debug.setupvalue(,2,true) 'p' +- debug.setupvalue(,'3',true) 'q' +- debug.setupvalue(,2,'abc') 'p' +- debug.setupvalue(,'3','abc') 'q' +p,q abc abc +--- checkallerrors +- debug.setupvalue() ...value expected... +--- checkallerrors +- debug.setupvalue() ...value expected... +--- checkallerrors +- debug.setupvalue(,2) ...value expected... +--- checkallerrors +- debug.setupvalue(nil,2) ...value expected... +- debug.setupvalue('abc',2) ...value expected... +- debug.setupvalue(1.25,2) ...value expected... +- debug.setupvalue(true,2) ...value expected... +- debug.setupvalue(
,2) ...value expected... +- debug.setupvalue(,2) ...value expected... +--- checkallerrors +- debug.setupvalue(,nil) ...value expected... +- debug.setupvalue(,'abc') ...value expected... +- debug.setupvalue(,true) ...value expected... +- debug.setupvalue(,
) ...value expected... +- debug.setupvalue(,) ...value expected... +- debug.setupvalue(,) ...value expected... +====== debug.setuservalue ====== +--- checkallerrors +- debug.setuservalue() ...userdata expected... +--- checkallerrors +- debug.setuservalue(nil) ...userdata expected... +- debug.setuservalue('abc') ...userdata expected... +- debug.setuservalue(1.25) ...userdata expected... +- debug.setuservalue(true) ...userdata expected... +- debug.setuservalue(
) ...userdata expected... +- debug.setuservalue() ...userdata expected... +- debug.setuservalue() ...userdata expected... +--- checkallerrors +- debug.setuservalue(nil,'abc') ...userdata expected... +- debug.setuservalue('abc','abc') ...userdata expected... +- debug.setuservalue(1.25,'abc') ...userdata expected... +- debug.setuservalue(true,'abc') ...userdata expected... +- debug.setuservalue(
,'abc') ...userdata expected... +- debug.setuservalue(,'abc') ...userdata expected... +- debug.setuservalue(,'abc') ...userdata expected... +- debug.setuservalue(nil,1.25) ...userdata expected... +- debug.setuservalue('abc',1.25) ...userdata expected... +- debug.setuservalue(1.25,1.25) ...userdata expected... +- debug.setuservalue(true,1.25) ...userdata expected... +- debug.setuservalue(
,1.25) ...userdata expected... +- debug.setuservalue(,1.25) ...userdata expected... +- debug.setuservalue(,1.25) ...userdata expected... +====== debug.traceback ====== +--- checkallpass +- debug.traceback() 'stack traceback: + [C]: in function 'pcall' + args.lua:143: in function 'invoke' + args.lua:167: in function 'checkallpass' + debuglibargs.lua:127: in main chunk + [C]: in ?' +--- checkallpass +- debug.traceback('abc') 'abc +stack traceback: + [C]: in function 'pcall' + args.lua:143: in function 'invoke' + args.lua:167: in function 'checkallpass' + debuglibargs.lua:128: in main chunk + [C]: in ?' +--- checkallpass +- debug.traceback('abc',1.25) 'abc +stack traceback: + [C]: in function 'pcall' + args.lua:143: in function 'invoke' + args.lua:167: in function 'checkallpass' + debuglibargs.lua:129: in main chunk + [C]: in ?' +--- checkallpass +- debug.traceback() 'stack traceback: + [C]: in function 'pcall' + args.lua:143: in function 'invoke' + args.lua:167: in function 'checkallpass' + debuglibargs.lua:130: in main chunk + [C]: in ?' +--- checkallpass +- debug.traceback(,'abc') 'abc +stack traceback: + [C]: in function 'pcall' + args.lua:143: in function 'invoke' + args.lua:167: in function 'checkallpass' + debuglibargs.lua:131: in main chunk + [C]: in ?' +--- checkallpass +- debug.traceback(,'abc',1.25) 'abc +stack traceback: + [C]: in function 'pcall' + args.lua:143: in function 'invoke' + args.lua:167: in function 'checkallpass' + debuglibargs.lua:132: in main chunk + [C]: in ?' +--- checkallpass +- debug.traceback() +- debug.traceback(true) true +- debug.traceback(
)
+--- checkallpass +- debug.traceback(,nil) +- debug.traceback(true,nil) true +- debug.traceback(
,nil)
+- debug.traceback(,'abc') +- debug.traceback(true,'abc') true +- debug.traceback(
,'abc')
+- debug.traceback(,true) +- debug.traceback(true,true) true +- debug.traceback(
,true)
+- debug.traceback(,
) +- debug.traceback(true,
) true +- debug.traceback(
,
)
+- debug.traceback(,) +- debug.traceback(true,) true +- debug.traceback(
,)
+- debug.traceback(,) +- debug.traceback(true,) true +- debug.traceback(
,)
+====== debug.upvalueid ====== +--- checkallpass +- debug.upvalueid(,1) +- debug.upvalueid(,'2') +--- checkallerrors +- debug.upvalueid() ...number expected... +--- checkallerrors +- debug.upvalueid(nil,1) ...function expected... +- debug.upvalueid('abc',1) ...function expected... +- debug.upvalueid(1.25,1) ...function expected... +- debug.upvalueid(true,1) ...function expected... +- debug.upvalueid(
,1) ...function expected... +- debug.upvalueid(,1) ...function expected... +- debug.upvalueid(nil,'2') ...function expected... +- debug.upvalueid('abc','2') ...function expected... +- debug.upvalueid(1.25,'2') ...function expected... +- debug.upvalueid(true,'2') ...function expected... +- debug.upvalueid(
,'2') ...function expected... +- debug.upvalueid(,'2') ...function expected... +--- checkallerrors +- debug.upvalueid(,nil) ...number expected... +- debug.upvalueid(,'abc') ...number expected... +- debug.upvalueid(,true) ...number expected... +- debug.upvalueid(,
) ...number expected... +- debug.upvalueid(,) ...number expected... +- debug.upvalueid(,) ...number expected... +====== debug.upvaluejoin ====== +--- checkallpass +- debug.upvaluejoin(,1,,1) +- debug.upvaluejoin(,'2',,1) +- debug.upvaluejoin(,1,,'2') +- debug.upvaluejoin(,'2',,'2') +--- checkallerrors +- debug.upvaluejoin() ...number expected... +--- checkallerrors +- debug.upvaluejoin(nil,1) ...function expected... +- debug.upvaluejoin('abc',1) ...function expected... +- debug.upvaluejoin(1.25,1) ...function expected... +- debug.upvaluejoin(true,1) ...function expected... +- debug.upvaluejoin(
,1) ...function expected... +- debug.upvaluejoin(,1) ...function expected... +- debug.upvaluejoin(nil,'2') ...function expected... +- debug.upvaluejoin('abc','2') ...function expected... +- debug.upvaluejoin(1.25,'2') ...function expected... +- debug.upvaluejoin(true,'2') ...function expected... +- debug.upvaluejoin(
,'2') ...function expected... +- debug.upvaluejoin(,'2') ...function expected... +--- checkallerrors +- debug.upvaluejoin(,nil) ...number expected... +- debug.upvaluejoin(,'abc') ...number expected... +- debug.upvaluejoin(,true) ...number expected... +- debug.upvaluejoin(,
) ...number expected... +- debug.upvaluejoin(,) ...number expected... +- debug.upvaluejoin(,) ...number expected... +--- checkallerrors +- debug.upvaluejoin(,1,nil,1) ...function expected... +- debug.upvaluejoin(,1,'abc',1) ...function expected... +- debug.upvaluejoin(,1,1.25,1) ...function expected... +- debug.upvaluejoin(,1,true,1) ...function expected... +- debug.upvaluejoin(,1,
,1) ...function expected... +- debug.upvaluejoin(,1,,1) ...function expected... +- debug.upvaluejoin(,1,nil,'2') ...function expected... +- debug.upvaluejoin(,1,'abc','2') ...function expected... +- debug.upvaluejoin(,1,1.25,'2') ...function expected... +- debug.upvaluejoin(,1,true,'2') ...function expected... +- debug.upvaluejoin(,1,
,'2') ...function expected... +- debug.upvaluejoin(,1,,'2') ...function expected... +--- checkallerrors +- debug.upvaluejoin(,1,,nil) ...number expected... +- debug.upvaluejoin(,1,,'abc') ...number expected... +- debug.upvaluejoin(,1,,true) ...number expected... +- debug.upvaluejoin(,1,,
) ...number expected... +- debug.upvaluejoin(,1,,) ...number expected... +- debug.upvaluejoin(,1,,) ...number expected... diff --git a/luaj-test/src/test/resources/errors/iolibargs.out b/luaj-test/src/test/resources/errors/iolibargs.out new file mode 100644 index 00000000..e0603df4 --- /dev/null +++ b/luaj-test/src/test/resources/errors/iolibargs.out @@ -0,0 +1,202 @@ +====== io.close ====== +--- checkallpass +- io.close() true +--- checkallerrors +- io.close('abc') ...bad argument... +- io.close(1.25) ...bad argument... +- io.close(true) ...bad argument... +- io.close(
) ...bad argument... +- io.close() ...bad argument... +- io.close() ...bad argument... +====== io.input ====== +--- checkallpass +- io.input(nil) +- io.input() +- io.input('abc.txt') +--- checkallerrors +- io.input(true) ...bad argument... +- io.input(
) ...bad argument... +- io.input() ...bad argument... +- io.input() ...bad argument... +====== io.lines ====== +--- checkallpass +- io.lines('abc.txt') +--- checkallerrors +- io.lines() ...bad argument... +--- checkallerrors +needcheck io.lines(nil) function: 0x100112cf0 +- io.lines(true) ...bad argument... +- io.lines(
) ...bad argument... +- io.lines() ...bad argument... +- io.lines() ...bad argument... +====== io.open ====== +--- checkallpass +- io.open('abc.txt',nil) +- io.open('abc.txt','r') +- io.open('abc.txt','w') +- io.open('abc.txt','a') +- io.open('abc.txt','r+') +- io.open('abc.txt','w+') +- io.open('abc.txt','a+') +--- checkallerrors +- io.open(nil) ...bad argument... +- io.open(true) ...bad argument... +- io.open(
) ...bad argument... +- io.open() ...bad argument... +- io.open() ...bad argument... +--- checkallerrors +- io.open('abc.txt',
) ...bad argument... +====== io.output ====== +--- checkallpass +- io.output(nil) +- io.output() +- io.output('abc.txt') +--- checkallerrors +- io.output(true) ...bad argument... +- io.output(
) ...bad argument... +- io.output() ...bad argument... +- io.output() ...bad argument... +====== io.popen ====== +--- checkallerrors +- io.popen(nil) ...bad argument... +- io.popen(true) ...bad argument... +- io.popen(
) ...bad argument... +- io.popen() ...bad argument... +- io.popen() ...bad argument... +--- checkallerrors +- io.popen('hostname',
) ...bad argument... +====== io.read ====== +--- checkallpass +- io.read() +--- checkallpass +- io.read(2) +- io.read('*n') +- io.read('*a') '' +- io.read('*l') +--- checkallpass +- io.read(2,2) +- io.read('*n',2) +- io.read('*a',2) '' +- io.read('*l',2) +- io.read(2,'*a') +- io.read('*n','*a') +- io.read('*a','*a') '','' +- io.read('*l','*a') +- io.read(2,'*l') +- io.read('*n','*l') +- io.read('*a','*l') '' +- io.read('*l','*l') +--- checkallerrors +- io.read(true) ...bad argument... +- io.read() ...bad argument... +- io.read(
) ...bad argument... +- io.read('3') ...bad argument... +====== io.write ====== +--- checkallpass +- io.write() +--- checkallpass +- io.write('abc') +- io.write(1.25) +--- checkallpass +- io.write('abc','abc') +- io.write(1.25,'abc') +- io.write('abc',1.25) +- io.write(1.25,1.25) +--- checkallerrors +- io.write(true) ...bad argument... +- io.write(
) ...bad argument... +- io.write() ...bad argument... +- io.write() ...bad argument... +--- checkallerrors +- io.write('abc',true) ...bad argument... +- io.write(1.25,true) ...bad argument... +- io.write('abc',
) ...bad argument... +- io.write(1.25,
) ...bad argument... +- io.write('abc',) ...bad argument... +- io.write(1.25,) ...bad argument... +- io.write('abc',) ...bad argument... +- io.write(1.25,) ...bad argument... +====== file:write ====== +--- checkallpass +- file.write(,'abc') +- file.write(,1.25) +--- checkallpass +- file.write(,'abc','abc') +- file.write(,1.25,'abc') +- file.write(,'abc',1.25) +- file.write(,1.25,1.25) +--- checkallerrors +- file.write() ...bad argument... +--- checkallerrors +- file.write(,true) ...bad argument... +- file.write(,
) ...bad argument... +- file.write(,) ...bad argument... +- file.write(,) ...bad argument... +--- checkallerrors +- file.write(,'abc',true) ...bad argument... +- file.write(,1.25,true) ...bad argument... +- file.write(,'abc',
) ...bad argument... +- file.write(,1.25,
) ...bad argument... +- file.write(,'abc',) ...bad argument... +- file.write(,1.25,) ...bad argument... +- file.write(,'abc',) ...bad argument... +- file.write(,1.25,) ...bad argument... +====== file:seek ====== +--- checkallpass +- file.seek() 0 +--- checkallpass +- file.seek(,'set') 0 +- file.seek(,'cur') 0 +- file.seek(,'end') 63 +--- checkallpass +- file.seek(,'set',2) 2 +- file.seek(,'cur',2) 4 +- file.seek(,'end',2) 65 +- file.seek(,'set','3') 3 +- file.seek(,'cur','3') 6 +- file.seek(,'end','3') 66 +--- checkallerrors +- file.seek() ...bad argument... +--- checkallerrors +- file.seek(,true) ...bad argument... +- file.seek(,
) ...bad argument... +- file.seek(,) ...bad argument... +- file.seek(,) ...bad argument... +--- checkallerrors +- file.seek(,'set','abc') ...bad argument... +- file.seek(,'cur','abc') ...bad argument... +- file.seek(,'end','abc') ...bad argument... +- file.seek(,'set',true) ...bad argument... +- file.seek(,'cur',true) ...bad argument... +- file.seek(,'end',true) ...bad argument... +- file.seek(,'set',
) ...bad argument... +- file.seek(,'cur',
) ...bad argument... +- file.seek(,'end',
) ...bad argument... +- file.seek(,'set',) ...bad argument... +- file.seek(,'cur',) ...bad argument... +- file.seek(,'end',) ...bad argument... +- file.seek(,'set',) ...bad argument... +- file.seek(,'cur',) ...bad argument... +- file.seek(,'end',) ...bad argument... +====== file:setvbuf ====== +--- checkallpass +- file.setvbuf(,'no') true +- file.setvbuf(,'full') true +- file.setvbuf(,'line') true +--- checkallpass +- file.setvbuf(,'full',1024) true +- file.setvbuf(,'full','512') true +--- checkallerrors +- file.setvbuf() ...bad argument... +--- checkallerrors +- file.setvbuf(,nil) ...bad argument... +- file.setvbuf(,true) ...bad argument... +- file.setvbuf(,
) ...bad argument... +- file.setvbuf(,) ...bad argument... +- file.setvbuf(,) ...bad argument... +--- checkallerrors +- file.setvbuf(,'full','abc') ...bad argument... +- file.setvbuf(,'full',true) ...bad argument... +- file.setvbuf(,'full',
) ...bad argument... +- file.setvbuf(,'full',) ...bad argument... +- file.setvbuf(,'full',) ...bad argument... diff --git a/luaj-test/src/test/resources/errors/mathlibargs.out b/luaj-test/src/test/resources/errors/mathlibargs.out new file mode 100644 index 00000000..5022fccd --- /dev/null +++ b/luaj-test/src/test/resources/errors/mathlibargs.out @@ -0,0 +1,750 @@ +====== math.abs ====== +--- checkallpass +- math.abs(1) 1 +- math.abs(0.75) 0.75 +- math.abs('-1') 1 +- math.abs('-0.25') 0.25 +--- checkallerrors +- math.abs(nil) ...bad argument... +- math.abs('abc') ...bad argument... +- math.abs(true) ...bad argument... +- math.abs() ...bad argument... +- math.abs(
) ...bad argument... +- math.abs() ...bad argument... +====== math.acos ====== +--- checkallpass +- math.acos(1) 0 +- math.acos(0.75) 0.722... +- math.acos('-1') 3.141... +- math.acos('-0.25') 1.823... +--- checkallerrors +- math.acos(nil) ...bad argument... +- math.acos('abc') ...bad argument... +- math.acos(true) ...bad argument... +- math.acos() ...bad argument... +- math.acos(
) ...bad argument... +- math.acos() ...bad argument... +====== math.asin ====== +--- checkallpass +- math.asin(1) 1.570... +- math.asin(0.75) 0.848... +- math.asin('-1') -1.57... +- math.asin('-0.25') -0.25... +--- checkallerrors +- math.asin(nil) ...bad argument... +- math.asin('abc') ...bad argument... +- math.asin(true) ...bad argument... +- math.asin() ...bad argument... +- math.asin(
) ...bad argument... +- math.asin() ...bad argument... +====== math.atan ====== +--- checkallpass +- math.atan(1) 0.785... +- math.atan(0.75) 0.643... +- math.atan('-1') -0.78... +- math.atan('-0.25') -0.24... +--- checkallerrors +- math.atan(nil) ...bad argument... +- math.atan('abc') ...bad argument... +- math.atan(true) ...bad argument... +- math.atan() ...bad argument... +- math.atan(
) ...bad argument... +- math.atan() ...bad argument... +====== math.cos ====== +--- checkallpass +- math.cos(1) 0.540... +- math.cos(0.75) 0.731... +- math.cos('-1') 0.540... +- math.cos('-0.25') 0.968... +--- checkallerrors +- math.cos(nil) ...bad argument... +- math.cos('abc') ...bad argument... +- math.cos(true) ...bad argument... +- math.cos() ...bad argument... +- math.cos(
) ...bad argument... +- math.cos() ...bad argument... +====== math.cosh ====== +--- checkallpass +- math.cosh(1) 1.543... +- math.cosh(0.75) 1.294... +- math.cosh('-1') 1.543... +- math.cosh('-0.25') 1.031... +--- checkallerrors +- math.cosh(nil) ...bad argument... +- math.cosh('abc') ...bad argument... +- math.cosh(true) ...bad argument... +- math.cosh() ...bad argument... +- math.cosh(
) ...bad argument... +- math.cosh() ...bad argument... +====== math.deg ====== +--- checkallpass +- math.deg(1) 57.29... +- math.deg(0.75) 42.97... +- math.deg('-1') -57.2... +- math.deg('-0.25') -14.3... +--- checkallerrors +- math.deg(nil) ...bad argument... +- math.deg('abc') ...bad argument... +- math.deg(true) ...bad argument... +- math.deg() ...bad argument... +- math.deg(
) ...bad argument... +- math.deg() ...bad argument... +====== math.exp ====== +--- checkallpass +- math.exp(1) 2.718... +- math.exp(0.75) 2.117... +- math.exp('-1') 0.367... +- math.exp('-0.25') 0.778... +--- checkallerrors +- math.exp(nil) ...bad argument... +- math.exp('abc') ...bad argument... +- math.exp(true) ...bad argument... +- math.exp() ...bad argument... +- math.exp(
) ...bad argument... +- math.exp() ...bad argument... +====== math.floor ====== +--- checkallpass +- math.floor(1) 1 +- math.floor(0.75) 0 +- math.floor('-1') -1 +- math.floor('-0.25') -1 +--- checkallerrors +- math.floor(nil) ...bad argument... +- math.floor('abc') ...bad argument... +- math.floor(true) ...bad argument... +- math.floor() ...bad argument... +- math.floor(
) ...bad argument... +- math.floor() ...bad argument... +====== math.rad ====== +--- checkallpass +- math.rad(1) 0.017... +- math.rad(0.75) 0.013... +- math.rad('-1') -0.01... +- math.rad('-0.25') -0.00... +--- checkallerrors +- math.rad(nil) ...bad argument... +- math.rad('abc') ...bad argument... +- math.rad(true) ...bad argument... +- math.rad() ...bad argument... +- math.rad(
) ...bad argument... +- math.rad() ...bad argument... +====== math.randomseed ====== +--- checkallpass +- math.randomseed(1) +- math.randomseed(0.75) +- math.randomseed('-1') +- math.randomseed('-0.25') +--- checkallerrors +- math.randomseed(nil) ...bad argument... +- math.randomseed('abc') ...bad argument... +- math.randomseed(true) ...bad argument... +- math.randomseed() ...bad argument... +- math.randomseed(
) ...bad argument... +- math.randomseed() ...bad argument... +====== math.sin ====== +--- checkallpass +- math.sin(1) 0.841... +- math.sin(0.75) 0.681... +- math.sin('-1') -0.84... +- math.sin('-0.25') -0.24... +--- checkallerrors +- math.sin(nil) ...bad argument... +- math.sin('abc') ...bad argument... +- math.sin(true) ...bad argument... +- math.sin() ...bad argument... +- math.sin(
) ...bad argument... +- math.sin() ...bad argument... +====== math.sinh ====== +--- checkallpass +- math.sinh(1) 1.175... +- math.sinh(0.75) 0.822... +- math.sinh('-1') -1.17... +- math.sinh('-0.25') -0.25... +--- checkallerrors +- math.sinh(nil) ...bad argument... +- math.sinh('abc') ...bad argument... +- math.sinh(true) ...bad argument... +- math.sinh() ...bad argument... +- math.sinh(
) ...bad argument... +- math.sinh() ...bad argument... +====== math.tan ====== +--- checkallpass +- math.tan(1) 1.557... +- math.tan(0.75) 0.931... +- math.tan('-1') -1.55... +- math.tan('-0.25') -0.25... +--- checkallerrors +- math.tan(nil) ...bad argument... +- math.tan('abc') ...bad argument... +- math.tan(true) ...bad argument... +- math.tan() ...bad argument... +- math.tan(
) ...bad argument... +- math.tan() ...bad argument... +====== math.tanh ====== +--- checkallpass +- math.tanh(1) 0.761... +- math.tanh(0.75) 0.635... +- math.tanh('-1') -0.76... +- math.tanh('-0.25') -0.24... +--- checkallerrors +- math.tanh(nil) ...bad argument... +- math.tanh('abc') ...bad argument... +- math.tanh(true) ...bad argument... +- math.tanh() ...bad argument... +- math.tanh(
) ...bad argument... +- math.tanh() ...bad argument... +====== math.frexp ====== +--- checkallpass +- math.frexp(1) 0.5,1 +- math.frexp(0.75) 0.75,0 +- math.frexp('-1') -0.5,1 +- math.frexp('-0.25') -0.5,-1 +--- checkallerrors +- math.frexp(nil) ...bad argument... +- math.frexp('abc') ...bad argument... +- math.frexp(true) ...bad argument... +- math.frexp() ...bad argument... +- math.frexp(
) ...bad argument... +- math.frexp() ...bad argument... +====== math.log ====== +--- checkallpass +- math.log(1) 0 +- math.log(0.75) -0.28... +- math.log('2') 0.693... +- math.log('2.5') 0.916... +--- checkallerrors +- math.log(nil) ...bad argument... +- math.log('abc') ...bad argument... +- math.log(true) ...bad argument... +- math.log() ...bad argument... +- math.log(
) ...bad argument... +- math.log() ...bad argument... +====== math.sqrt ====== +--- checkallpass +- math.sqrt(1) 1 +- math.sqrt(0.75) 0.866... +- math.sqrt('2') 1.414... +- math.sqrt('2.5') 1.581... +--- checkallerrors +- math.sqrt(nil) ...bad argument... +- math.sqrt('abc') ...bad argument... +- math.sqrt(true) ...bad argument... +- math.sqrt() ...bad argument... +- math.sqrt(
) ...bad argument... +- math.sqrt() ...bad argument... +====== math.ceil ====== +--- checkallpass +- math.ceil(1) 1 +- math.ceil(0.75) 1 +- math.ceil('2') 2 +- math.ceil('2.5') 3 +--- checkallerrors +- math.ceil(nil) ...bad argument... +- math.ceil('abc') ...bad argument... +- math.ceil(true) ...bad argument... +- math.ceil() ...bad argument... +- math.ceil(
) ...bad argument... +- math.ceil() ...bad argument... +====== math.atan2 ====== +--- checkallpass +- math.atan2(1,1) 0.785... +- math.atan2(0.75,1) 0.643... +- math.atan2('-1',1) -0.78... +- math.atan2('-0.25',1) -0.24... +- math.atan2(1,0.75) 0.927... +- math.atan2(0.75,0.75) 0.785... +- math.atan2('-1',0.75) -0.92... +- math.atan2('-0.25',0.75) -0.32... +- math.atan2(1,'-1') 2.356... +- math.atan2(0.75,'-1') 2.498... +- math.atan2('-1','-1') -2.35... +- math.atan2('-0.25','-1') -2.89... +- math.atan2(1,'-0.25') 1.815... +- math.atan2(0.75,'-0.25') 1.892... +- math.atan2('-1','-0.25') -1.81... +- math.atan2('-0.25','-0.25') -2.35... +--- checkallerrors +- math.atan2() ...bad argument... +--- checkallerrors +- math.atan2(nil) ...bad argument... +- math.atan2('abc') ...bad argument... +- math.atan2(true) ...bad argument... +- math.atan2() ...bad argument... +- math.atan2(
) ...bad argument... +- math.atan2() ...bad argument... +--- checkallerrors +- math.atan2(nil,1) ...bad argument... +- math.atan2('abc',1) ...bad argument... +- math.atan2(true,1) ...bad argument... +- math.atan2(,1) ...bad argument... +- math.atan2(
,1) ...bad argument... +- math.atan2(,1) ...bad argument... +- math.atan2(nil,0.75) ...bad argument... +- math.atan2('abc',0.75) ...bad argument... +- math.atan2(true,0.75) ...bad argument... +- math.atan2(,0.75) ...bad argument... +- math.atan2(
,0.75) ...bad argument... +- math.atan2(,0.75) ...bad argument... +- math.atan2(nil,'-1') ...bad argument... +- math.atan2('abc','-1') ...bad argument... +- math.atan2(true,'-1') ...bad argument... +- math.atan2(,'-1') ...bad argument... +- math.atan2(
,'-1') ...bad argument... +- math.atan2(,'-1') ...bad argument... +- math.atan2(nil,'-0.25') ...bad argument... +- math.atan2('abc','-0.25') ...bad argument... +- math.atan2(true,'-0.25') ...bad argument... +- math.atan2(,'-0.25') ...bad argument... +- math.atan2(
,'-0.25') ...bad argument... +- math.atan2(,'-0.25') ...bad argument... +--- checkallerrors +- math.atan2(1) ...bad argument... +- math.atan2(0.75) ...bad argument... +- math.atan2('-1') ...bad argument... +- math.atan2('-0.25') ...bad argument... +--- checkallerrors +- math.atan2(1,nil) ...bad argument... +- math.atan2(0.75,nil) ...bad argument... +- math.atan2('-1',nil) ...bad argument... +- math.atan2('-0.25',nil) ...bad argument... +- math.atan2(1,'abc') ...bad argument... +- math.atan2(0.75,'abc') ...bad argument... +- math.atan2('-1','abc') ...bad argument... +- math.atan2('-0.25','abc') ...bad argument... +- math.atan2(1,true) ...bad argument... +- math.atan2(0.75,true) ...bad argument... +- math.atan2('-1',true) ...bad argument... +- math.atan2('-0.25',true) ...bad argument... +- math.atan2(1,) ...bad argument... +- math.atan2(0.75,) ...bad argument... +- math.atan2('-1',) ...bad argument... +- math.atan2('-0.25',) ...bad argument... +- math.atan2(1,
) ...bad argument... +- math.atan2(0.75,
) ...bad argument... +- math.atan2('-1',
) ...bad argument... +- math.atan2('-0.25',
) ...bad argument... +- math.atan2(1,) ...bad argument... +- math.atan2(0.75,) ...bad argument... +- math.atan2('-1',) ...bad argument... +- math.atan2('-0.25',) ...bad argument... +====== math.pow ====== +--- checkallpass +- math.pow(1,1) 1 +- math.pow(0.75,1) 0.75 +- math.pow('2',1) 2 +- math.pow('2.5',1) 2.5 +- math.pow(1,0.75) 1 +- math.pow(0.75,0.75) 0.805... +- math.pow('2',0.75) 1.681... +- math.pow('2.5',0.75) 1.988... +- math.pow(1,'-1') 1 +- math.pow(0.75,'-1') 1.333... +- math.pow('2','-1') 0.5 +- math.pow('2.5','-1') 0.4 +- math.pow(1,'-0.25') 1 +- math.pow(0.75,'-0.25') 1.074... +- math.pow('2','-0.25') 0.840... +- math.pow('2.5','-0.25') 0.795... +--- checkallerrors +- math.pow() ...bad argument... +--- checkallerrors +- math.pow(nil) ...bad argument... +- math.pow('abc') ...bad argument... +- math.pow(true) ...bad argument... +- math.pow() ...bad argument... +- math.pow(
) ...bad argument... +- math.pow() ...bad argument... +--- checkallerrors +- math.pow(nil,1) ...bad argument... +- math.pow('abc',1) ...bad argument... +- math.pow(true,1) ...bad argument... +- math.pow(,1) ...bad argument... +- math.pow(
,1) ...bad argument... +- math.pow(,1) ...bad argument... +- math.pow(nil,0.75) ...bad argument... +- math.pow('abc',0.75) ...bad argument... +- math.pow(true,0.75) ...bad argument... +- math.pow(,0.75) ...bad argument... +- math.pow(
,0.75) ...bad argument... +- math.pow(,0.75) ...bad argument... +- math.pow(nil,'-1') ...bad argument... +- math.pow('abc','-1') ...bad argument... +- math.pow(true,'-1') ...bad argument... +- math.pow(,'-1') ...bad argument... +- math.pow(
,'-1') ...bad argument... +- math.pow(,'-1') ...bad argument... +- math.pow(nil,'-0.25') ...bad argument... +- math.pow('abc','-0.25') ...bad argument... +- math.pow(true,'-0.25') ...bad argument... +- math.pow(,'-0.25') ...bad argument... +- math.pow(
,'-0.25') ...bad argument... +- math.pow(,'-0.25') ...bad argument... +--- checkallerrors +- math.pow(1) ...bad argument... +- math.pow(0.75) ...bad argument... +- math.pow('-1') ...bad argument... +- math.pow('-0.25') ...bad argument... +--- checkallerrors +- math.pow(1,nil) ...bad argument... +- math.pow(0.75,nil) ...bad argument... +- math.pow('-1',nil) ...bad argument... +- math.pow('-0.25',nil) ...bad argument... +- math.pow(1,'abc') ...bad argument... +- math.pow(0.75,'abc') ...bad argument... +- math.pow('-1','abc') ...bad argument... +- math.pow('-0.25','abc') ...bad argument... +- math.pow(1,true) ...bad argument... +- math.pow(0.75,true) ...bad argument... +- math.pow('-1',true) ...bad argument... +- math.pow('-0.25',true) ...bad argument... +- math.pow(1,) ...bad argument... +- math.pow(0.75,) ...bad argument... +- math.pow('-1',) ...bad argument... +- math.pow('-0.25',) ...bad argument... +- math.pow(1,
) ...bad argument... +- math.pow(0.75,
) ...bad argument... +- math.pow('-1',
) ...bad argument... +- math.pow('-0.25',
) ...bad argument... +- math.pow(1,) ...bad argument... +- math.pow(0.75,) ...bad argument... +- math.pow('-1',) ...bad argument... +- math.pow('-0.25',) ...bad argument... +====== math.fmod ====== +--- checkallpass +- math.fmod(1,1) 0 +- math.fmod(0.75,1) 0.75 +- math.fmod('2',1) 0 +- math.fmod('2.5',1) 0.5 +- math.fmod(1,0.75) 0.25 +- math.fmod(0.75,0.75) 0 +- math.fmod('2',0.75) 0.5 +- math.fmod('2.5',0.75) 0.25 +- math.fmod(1,'-1') 0 +- math.fmod(0.75,'-1') 0.75 +- math.fmod('2','-1') 0 +- math.fmod('2.5','-1') 0.5 +- math.fmod(1,'-0.25') 0 +- math.fmod(0.75,'-0.25') 0 +- math.fmod('2','-0.25') 0 +- math.fmod('2.5','-0.25') 0 +--- checkallerrors +- math.fmod() ...bad argument... +--- checkallerrors +- math.fmod(nil) ...bad argument... +- math.fmod('abc') ...bad argument... +- math.fmod(true) ...bad argument... +- math.fmod() ...bad argument... +- math.fmod(
) ...bad argument... +- math.fmod() ...bad argument... +--- checkallerrors +- math.fmod(nil,1) ...bad argument... +- math.fmod('abc',1) ...bad argument... +- math.fmod(true,1) ...bad argument... +- math.fmod(,1) ...bad argument... +- math.fmod(
,1) ...bad argument... +- math.fmod(,1) ...bad argument... +- math.fmod(nil,0.75) ...bad argument... +- math.fmod('abc',0.75) ...bad argument... +- math.fmod(true,0.75) ...bad argument... +- math.fmod(,0.75) ...bad argument... +- math.fmod(
,0.75) ...bad argument... +- math.fmod(,0.75) ...bad argument... +- math.fmod(nil,'-1') ...bad argument... +- math.fmod('abc','-1') ...bad argument... +- math.fmod(true,'-1') ...bad argument... +- math.fmod(,'-1') ...bad argument... +- math.fmod(
,'-1') ...bad argument... +- math.fmod(,'-1') ...bad argument... +- math.fmod(nil,'-0.25') ...bad argument... +- math.fmod('abc','-0.25') ...bad argument... +- math.fmod(true,'-0.25') ...bad argument... +- math.fmod(,'-0.25') ...bad argument... +- math.fmod(
,'-0.25') ...bad argument... +- math.fmod(,'-0.25') ...bad argument... +--- checkallerrors +- math.fmod(1) ...bad argument... +- math.fmod(0.75) ...bad argument... +- math.fmod('-1') ...bad argument... +- math.fmod('-0.25') ...bad argument... +--- checkallerrors +- math.fmod(1,nil) ...bad argument... +- math.fmod(0.75,nil) ...bad argument... +- math.fmod('-1',nil) ...bad argument... +- math.fmod('-0.25',nil) ...bad argument... +- math.fmod(1,'abc') ...bad argument... +- math.fmod(0.75,'abc') ...bad argument... +- math.fmod('-1','abc') ...bad argument... +- math.fmod('-0.25','abc') ...bad argument... +- math.fmod(1,true) ...bad argument... +- math.fmod(0.75,true) ...bad argument... +- math.fmod('-1',true) ...bad argument... +- math.fmod('-0.25',true) ...bad argument... +- math.fmod(1,) ...bad argument... +- math.fmod(0.75,) ...bad argument... +- math.fmod('-1',) ...bad argument... +- math.fmod('-0.25',) ...bad argument... +- math.fmod(1,
) ...bad argument... +- math.fmod(0.75,
) ...bad argument... +- math.fmod('-1',
) ...bad argument... +- math.fmod('-0.25',
) ...bad argument... +- math.fmod(1,) ...bad argument... +- math.fmod(0.75,) ...bad argument... +- math.fmod('-1',) ...bad argument... +- math.fmod('-0.25',) ...bad argument... +====== math.max ====== +--- checkallpass +- math.max(1) 1 +- math.max(0.75) 0.75 +- math.max('-1') -1 +- math.max('-0.25') -0.25... +--- checkallpass +- math.max(1,1) 1 +- math.max(0.75,1) 1 +- math.max('-1',1) 1 +- math.max('-0.25',1) 1 +- math.max(1,0.75) 1 +- math.max(0.75,0.75) 0.75 +- math.max('-1',0.75) 0.75 +- math.max('-0.25',0.75) 0.75 +- math.max(1,'-1') 1 +- math.max(0.75,'-1') 0.75 +- math.max('-1','-1') -1 +- math.max('-0.25','-1') -0.25... +- math.max(1,'-0.25') 1 +- math.max(0.75,'-0.25') 0.75 +- math.max('-1','-0.25') -0.25... +- math.max('-0.25','-0.25') -0.25... +--- checkallerrors +- math.max() ...bad argument... +--- checkallerrors +- math.max('abc') ...bad argument... +- math.max(true) ...bad argument... +- math.max() ...bad argument... +- math.max(
) ...bad argument... +--- checkallerrors +- math.max(1,'abc') ...bad argument... +- math.max(0.75,'abc') ...bad argument... +- math.max('-1','abc') ...bad argument... +- math.max('-0.25','abc') ...bad argument... +- math.max(1,true) ...bad argument... +- math.max(0.75,true) ...bad argument... +- math.max('-1',true) ...bad argument... +- math.max('-0.25',true) ...bad argument... +- math.max(1,) ...bad argument... +- math.max(0.75,) ...bad argument... +- math.max('-1',) ...bad argument... +- math.max('-0.25',) ...bad argument... +- math.max(1,
) ...bad argument... +- math.max(0.75,
) ...bad argument... +- math.max('-1',
) ...bad argument... +- math.max('-0.25',
) ...bad argument... +====== math.min ====== +--- checkallpass +- math.min(1) 1 +- math.min(0.75) 0.75 +- math.min('-1') -1 +- math.min('-0.25') -0.25... +--- checkallpass +- math.min(1,1) 1 +- math.min(0.75,1) 0.75 +- math.min('-1',1) -1 +- math.min('-0.25',1) -0.25... +- math.min(1,0.75) 0.75 +- math.min(0.75,0.75) 0.75 +- math.min('-1',0.75) -1 +- math.min('-0.25',0.75) -0.25... +- math.min(1,'-1') -1 +- math.min(0.75,'-1') -1 +- math.min('-1','-1') -1 +- math.min('-0.25','-1') -1 +- math.min(1,'-0.25') -0.25... +- math.min(0.75,'-0.25') -0.25... +- math.min('-1','-0.25') -1 +- math.min('-0.25','-0.25') -0.25... +--- checkallerrors +- math.min() ...bad argument... +--- checkallerrors +- math.min('abc') ...bad argument... +- math.min(true) ...bad argument... +- math.min() ...bad argument... +- math.min(
) ...bad argument... +--- checkallerrors +- math.min(1,'abc') ...bad argument... +- math.min(0.75,'abc') ...bad argument... +- math.min('-1','abc') ...bad argument... +- math.min('-0.25','abc') ...bad argument... +- math.min(1,true) ...bad argument... +- math.min(0.75,true) ...bad argument... +- math.min('-1',true) ...bad argument... +- math.min('-0.25',true) ...bad argument... +- math.min(1,) ...bad argument... +- math.min(0.75,) ...bad argument... +- math.min('-1',) ...bad argument... +- math.min('-0.25',) ...bad argument... +- math.min(1,
) ...bad argument... +- math.min(0.75,
) ...bad argument... +- math.min('-1',
) ...bad argument... +- math.min('-0.25',
) ...bad argument... +====== math.random ====== +--- checkallpass +- math.random() number +--- checkallpass +- math.random(3) number +- math.random(4.5) number +- math.random('6.7') number +--- checkallpass +- math.random(3,8) number +- math.random(4.5,8) number +- math.random('6.7',8) number +- math.random(3,9.1) number +- math.random(4.5,9.1) number +- math.random('6.7',9.1) number +- math.random(3,'12.34') number +- math.random(4.5,'12.34') number +- math.random('6.7','12.34') number +--- checkallpass +- math.random(-4,-1) number +- math.random(-5.6,-1) number +- math.random('-7',-1) number +- math.random('-8.9',-1) number +- math.random(-4,100) number +- math.random(-5.6,100) number +- math.random('-7',100) number +- math.random('-8.9',100) number +- math.random(-4,23.45...) number +- math.random(-5.6,23.45...) number +- math.random('-7',23.45...) number +- math.random('-8.9',23.45...) number +- math.random(-4,'-1.23') number +- math.random(-5.6,'-1.23') number +- math.random('-7','-1.23') number +- math.random('-8.9','-1.23') number +--- checkallerrors +- math.random(-4) ...interval is empty... +- math.random(-5.6) ...interval is empty... +- math.random('-7') ...interval is empty... +- math.random('-8.9') ...interval is empty... +--- checkallerrors +- math.random(8,3) ...interval is empty... +- math.random(9.1,3) ...interval is empty... +- math.random('12.34',3) ...interval is empty... +- math.random(8,4.5) ...interval is empty... +- math.random(9.1,4.5) ...interval is empty... +- math.random('12.34',4.5) ...interval is empty... +- math.random(8,'6.7') ...interval is empty... +- math.random(9.1,'6.7') ...interval is empty... +- math.random('12.34','6.7') ...interval is empty... +--- checkallerrors +- math.random('abc',8) ...bad argument... +- math.random(true,8) ...bad argument... +- math.random(
,8) ...bad argument... +- math.random(,8) ...bad argument... +- math.random('abc',9.1) ...bad argument... +- math.random(true,9.1) ...bad argument... +- math.random(
,9.1) ...bad argument... +- math.random(,9.1) ...bad argument... +- math.random('abc','12.34') ...bad argument... +- math.random(true,'12.34') ...bad argument... +- math.random(
,'12.34') ...bad argument... +- math.random(,'12.34') ...bad argument... +--- checkallerrors +- math.random(3,'abc') ...bad argument... +- math.random(4.5,'abc') ...bad argument... +- math.random('6.7','abc') ...bad argument... +- math.random(3,true) ...bad argument... +- math.random(4.5,true) ...bad argument... +- math.random('6.7',true) ...bad argument... +- math.random(3,
) ...bad argument... +- math.random(4.5,
) ...bad argument... +- math.random('6.7',
) ...bad argument... +- math.random(3,) ...bad argument... +- math.random(4.5,) ...bad argument... +- math.random('6.7',) ...bad argument... +====== math.ldexp ====== +--- checkallpass +- math.ldexp(1,-3) 0.125... +- math.ldexp(0.75,-3) 0.093... +- math.ldexp('-1',-3) -0.12... +- math.ldexp('-0.25',-3) -0.03... +- math.ldexp(1,0) 1 +- math.ldexp(0.75,0) 0.75 +- math.ldexp('-1',0) -1 +- math.ldexp('-0.25',0) -0.25... +- math.ldexp(1,3) 8 +- math.ldexp(0.75,3) 6 +- math.ldexp('-1',3) -8 +- math.ldexp('-0.25',3) -2 +- math.ldexp(1,9.1) 512 +- math.ldexp(0.75,9.1) 384 +- math.ldexp('-1',9.1) -512 +- math.ldexp('-0.25',9.1) -128 +- math.ldexp(1,'12.34') 4096 +- math.ldexp(0.75,'12.34') 3072 +- math.ldexp('-1','12.34') -4096... +- math.ldexp('-0.25','12.34') -1024... +--- checkallerrors +- math.ldexp() ...bad argument... +--- checkallerrors +- math.ldexp(nil) ...bad argument... +- math.ldexp('abc') ...bad argument... +- math.ldexp(true) ...bad argument... +- math.ldexp() ...bad argument... +- math.ldexp(
) ...bad argument... +- math.ldexp() ...bad argument... +--- checkallerrors +- math.ldexp(nil,-3) ...bad argument... +- math.ldexp('abc',-3) ...bad argument... +- math.ldexp(true,-3) ...bad argument... +- math.ldexp(,-3) ...bad argument... +- math.ldexp(
,-3) ...bad argument... +- math.ldexp(,-3) ...bad argument... +- math.ldexp(nil,0) ...bad argument... +- math.ldexp('abc',0) ...bad argument... +- math.ldexp(true,0) ...bad argument... +- math.ldexp(,0) ...bad argument... +- math.ldexp(
,0) ...bad argument... +- math.ldexp(,0) ...bad argument... +- math.ldexp(nil,3) ...bad argument... +- math.ldexp('abc',3) ...bad argument... +- math.ldexp(true,3) ...bad argument... +- math.ldexp(,3) ...bad argument... +- math.ldexp(
,3) ...bad argument... +- math.ldexp(,3) ...bad argument... +- math.ldexp(nil,9.1) ...bad argument... +- math.ldexp('abc',9.1) ...bad argument... +- math.ldexp(true,9.1) ...bad argument... +- math.ldexp(,9.1) ...bad argument... +- math.ldexp(
,9.1) ...bad argument... +- math.ldexp(,9.1) ...bad argument... +- math.ldexp(nil,'12.34') ...bad argument... +- math.ldexp('abc','12.34') ...bad argument... +- math.ldexp(true,'12.34') ...bad argument... +- math.ldexp(,'12.34') ...bad argument... +- math.ldexp(
,'12.34') ...bad argument... +- math.ldexp(,'12.34') ...bad argument... +--- checkallerrors +- math.ldexp(1) ...bad argument... +- math.ldexp(0.75) ...bad argument... +- math.ldexp('-1') ...bad argument... +- math.ldexp('-0.25') ...bad argument... +--- checkallerrors +- math.ldexp(1,nil) ...bad argument... +- math.ldexp(0.75,nil) ...bad argument... +- math.ldexp('-1',nil) ...bad argument... +- math.ldexp('-0.25',nil) ...bad argument... +- math.ldexp(1,'abc') ...bad argument... +- math.ldexp(0.75,'abc') ...bad argument... +- math.ldexp('-1','abc') ...bad argument... +- math.ldexp('-0.25','abc') ...bad argument... +- math.ldexp(1,true) ...bad argument... +- math.ldexp(0.75,true) ...bad argument... +- math.ldexp('-1',true) ...bad argument... +- math.ldexp('-0.25',true) ...bad argument... +- math.ldexp(1,
) ...bad argument... +- math.ldexp(0.75,
) ...bad argument... +- math.ldexp('-1',
) ...bad argument... +- math.ldexp('-0.25',
) ...bad argument... +- math.ldexp(1,) ...bad argument... +- math.ldexp(0.75,) ...bad argument... +- math.ldexp('-1',) ...bad argument... +- math.ldexp('-0.25',) ...bad argument... diff --git a/luaj-test/src/test/resources/errors/modulelibargs.out b/luaj-test/src/test/resources/errors/modulelibargs.out new file mode 100644 index 00000000..65071399 --- /dev/null +++ b/luaj-test/src/test/resources/errors/modulelibargs.out @@ -0,0 +1,33 @@ +====== require ====== +--- checkallpass +- require('math') table +- require('coroutine') table +- require('package') table +- require('string') table +- require('table') table +--- checkallerrors +- require(1.25) ...not found... +--- checkallerrors +- require(nil) ...bad argument... +- require(true) ...bad argument... +- require() ...bad argument... +- require(
) ...bad argument... +====== package.loadlib ====== +--- checkallpass +- package.loadlib('foo','bar') nil,string,string +--- checkallerrors +- package.loadlib(nil) ...bad argument... +- package.loadlib(true) ...bad argument... +- package.loadlib(
) ...bad argument... +- package.loadlib() ...bad argument... +- package.loadlib() ...bad argument... +====== package.seeall ====== +--- checkallpass +fail package.seeall(
) 'attempt to call a nil value' +--- checkallerrors +badmsg package.seeall(nil) template='bad argument' actual='attempt to call a nil value' +badmsg package.seeall('abc') template='bad argument' actual='attempt to call a nil value' +badmsg package.seeall(1.25) template='bad argument' actual='attempt to call a nil value' +badmsg package.seeall(true) template='bad argument' actual='attempt to call a nil value' +badmsg package.seeall() template='bad argument' actual='attempt to call a nil value' +badmsg package.seeall() template='bad argument' actual='attempt to call a nil value' diff --git a/luaj-test/src/test/resources/errors/operators.out b/luaj-test/src/test/resources/errors/operators.out new file mode 100644 index 00000000..126f0c69 --- /dev/null +++ b/luaj-test/src/test/resources/errors/operators.out @@ -0,0 +1,837 @@ +====== unary - ====== +--- checkallpass +- negative(1.25) -1.25 +- negative('789') -789 +--- checkallerrors +- negative(nil) ...attempt to perform arithmetic... +- negative('abc') ...attempt to perform arithmetic... +- negative(true) ...attempt to perform arithmetic... +- negative(
) ...attempt to perform arithmetic... +- negative() ...attempt to perform arithmetic... +- negative() ...attempt to perform arithmetic... +====== # ====== +--- checkallpass +- lengthop(
) 0 +--- checkallerrors +- lengthop(nil) ...attempt to get length of... +needcheck lengthop('abc') 3 +- lengthop(1.25) ...attempt to get length of... +- lengthop(true) ...attempt to get length of... +- lengthop() ...attempt to get length of... +- lengthop() ...attempt to get length of... +====== not ====== +--- checkallpass +- notop(1.25) false +- notop('789') false +--- checkallpass +- notop(nil) true +- notop('abc') false +- notop(true) false +- notop(
) false +- notop() false +- notop() false +====== () ====== +--- checkallpass +- funcop() +--- checkallerrors +- funcop(nil) ...attempt to call... +- funcop('abc') ...attempt to call... +- funcop(1.25) ...attempt to call... +- funcop(true) ...attempt to call... +- funcop(
) ...attempt to call... +- funcop() ...attempt to call... +====== .. ====== +--- checkallpass +- concatop('abc','abc') 'abcabc' +- concatop(1.25,'abc') '1.25abc' +- concatop('abc',1.25) 'abc1.25' +- concatop(1.25,1.25) '1.251.25' +--- checkallerrors +- concatop(nil,'abc') ...attempt to concatenate... +- concatop(true,'abc') ...attempt to concatenate... +- concatop(
,'abc') ...attempt to concatenate... +- concatop(,'abc') ...attempt to concatenate... +- concatop(,'abc') ...attempt to concatenate... +- concatop(nil,1.25) ...attempt to concatenate... +- concatop(true,1.25) ...attempt to concatenate... +- concatop(
,1.25) ...attempt to concatenate... +- concatop(,1.25) ...attempt to concatenate... +- concatop(,1.25) ...attempt to concatenate... +--- checkallerrors +- concatop('abc',nil) ...attempt to concatenate... +- concatop(1.25,nil) ...attempt to concatenate... +- concatop('abc',true) ...attempt to concatenate... +- concatop(1.25,true) ...attempt to concatenate... +- concatop('abc',
) ...attempt to concatenate... +- concatop(1.25,
) ...attempt to concatenate... +- concatop('abc',) ...attempt to concatenate... +- concatop(1.25,) ...attempt to concatenate... +- concatop('abc',) ...attempt to concatenate... +- concatop(1.25,) ...attempt to concatenate... +====== + ====== +--- checkallpass +- plusop(1.25,1.25) 2.5 +- plusop('789',1.25) 790.25 +- plusop(1.25,'789') 790.25 +- plusop('789','789') 1578 +--- checkallerrors +- plusop(nil,1.25) ...attempt to perform arithmetic... +- plusop('abc',1.25) ...attempt to perform arithmetic... +- plusop(true,1.25) ...attempt to perform arithmetic... +- plusop(
,1.25) ...attempt to perform arithmetic... +- plusop(,1.25) ...attempt to perform arithmetic... +- plusop(,1.25) ...attempt to perform arithmetic... +- plusop(nil,'789') ...attempt to perform arithmetic... +- plusop('abc','789') ...attempt to perform arithmetic... +- plusop(true,'789') ...attempt to perform arithmetic... +- plusop(
,'789') ...attempt to perform arithmetic... +- plusop(,'789') ...attempt to perform arithmetic... +- plusop(,'789') ...attempt to perform arithmetic... +--- checkallerrors +- plusop(1.25,nil) ...attempt to perform arithmetic... +- plusop('789',nil) ...attempt to perform arithmetic... +- plusop(1.25,'abc') ...attempt to perform arithmetic... +- plusop('789','abc') ...attempt to perform arithmetic... +- plusop(1.25,true) ...attempt to perform arithmetic... +- plusop('789',true) ...attempt to perform arithmetic... +- plusop(1.25,
) ...attempt to perform arithmetic... +- plusop('789',
) ...attempt to perform arithmetic... +- plusop(1.25,) ...attempt to perform arithmetic... +- plusop('789',) ...attempt to perform arithmetic... +- plusop(1.25,) ...attempt to perform arithmetic... +- plusop('789',) ...attempt to perform arithmetic... +====== - ====== +--- checkallpass +- minusop(1.25,1.25) 0 +- minusop('789',1.25) 787.75 +- minusop(1.25,'789') -787.75 +- minusop('789','789') 0 +--- checkallerrors +- minusop(nil,1.25) ...attempt to perform arithmetic... +- minusop('abc',1.25) ...attempt to perform arithmetic... +- minusop(true,1.25) ...attempt to perform arithmetic... +- minusop(
,1.25) ...attempt to perform arithmetic... +- minusop(,1.25) ...attempt to perform arithmetic... +- minusop(,1.25) ...attempt to perform arithmetic... +- minusop(nil,'789') ...attempt to perform arithmetic... +- minusop('abc','789') ...attempt to perform arithmetic... +- minusop(true,'789') ...attempt to perform arithmetic... +- minusop(
,'789') ...attempt to perform arithmetic... +- minusop(,'789') ...attempt to perform arithmetic... +- minusop(,'789') ...attempt to perform arithmetic... +--- checkallerrors +- minusop(1.25,nil) ...attempt to perform arithmetic... +- minusop('789',nil) ...attempt to perform arithmetic... +- minusop(1.25,'abc') ...attempt to perform arithmetic... +- minusop('789','abc') ...attempt to perform arithmetic... +- minusop(1.25,true) ...attempt to perform arithmetic... +- minusop('789',true) ...attempt to perform arithmetic... +- minusop(1.25,
) ...attempt to perform arithmetic... +- minusop('789',
) ...attempt to perform arithmetic... +- minusop(1.25,) ...attempt to perform arithmetic... +- minusop('789',) ...attempt to perform arithmetic... +- minusop(1.25,) ...attempt to perform arithmetic... +- minusop('789',) ...attempt to perform arithmetic... +====== * ====== +--- checkallpass +- timesop(1.25,1.25) 1.5625 +- timesop('789',1.25) 986.25 +- timesop(1.25,'789') 986.25 +- timesop('789','789') 622521 +--- checkallerrors +- timesop(nil,1.25) ...attempt to perform arithmetic... +- timesop('abc',1.25) ...attempt to perform arithmetic... +- timesop(true,1.25) ...attempt to perform arithmetic... +- timesop(
,1.25) ...attempt to perform arithmetic... +- timesop(,1.25) ...attempt to perform arithmetic... +- timesop(,1.25) ...attempt to perform arithmetic... +- timesop(nil,'789') ...attempt to perform arithmetic... +- timesop('abc','789') ...attempt to perform arithmetic... +- timesop(true,'789') ...attempt to perform arithmetic... +- timesop(
,'789') ...attempt to perform arithmetic... +- timesop(,'789') ...attempt to perform arithmetic... +- timesop(,'789') ...attempt to perform arithmetic... +--- checkallerrors +- timesop(1.25,nil) ...attempt to perform arithmetic... +- timesop('789',nil) ...attempt to perform arithmetic... +- timesop(1.25,'abc') ...attempt to perform arithmetic... +- timesop('789','abc') ...attempt to perform arithmetic... +- timesop(1.25,true) ...attempt to perform arithmetic... +- timesop('789',true) ...attempt to perform arithmetic... +- timesop(1.25,
) ...attempt to perform arithmetic... +- timesop('789',
) ...attempt to perform arithmetic... +- timesop(1.25,) ...attempt to perform arithmetic... +- timesop('789',) ...attempt to perform arithmetic... +- timesop(1.25,) ...attempt to perform arithmetic... +- timesop('789',) ...attempt to perform arithmetic... +====== / ====== +--- checkallpass +- divideop(1.25,1.25) 1 +- divideop('789',1.25) 631.2 +- divideop(1.25,'789') 0.001584... +- divideop('789','789') 1 +--- checkallerrors +- divideop(nil,1.25) ...attempt to perform arithmetic... +- divideop('abc',1.25) ...attempt to perform arithmetic... +- divideop(true,1.25) ...attempt to perform arithmetic... +- divideop(
,1.25) ...attempt to perform arithmetic... +- divideop(,1.25) ...attempt to perform arithmetic... +- divideop(,1.25) ...attempt to perform arithmetic... +- divideop(nil,'789') ...attempt to perform arithmetic... +- divideop('abc','789') ...attempt to perform arithmetic... +- divideop(true,'789') ...attempt to perform arithmetic... +- divideop(
,'789') ...attempt to perform arithmetic... +- divideop(,'789') ...attempt to perform arithmetic... +- divideop(,'789') ...attempt to perform arithmetic... +--- checkallerrors +- divideop(1.25,nil) ...attempt to perform arithmetic... +- divideop('789',nil) ...attempt to perform arithmetic... +- divideop(1.25,'abc') ...attempt to perform arithmetic... +- divideop('789','abc') ...attempt to perform arithmetic... +- divideop(1.25,true) ...attempt to perform arithmetic... +- divideop('789',true) ...attempt to perform arithmetic... +- divideop(1.25,
) ...attempt to perform arithmetic... +- divideop('789',
) ...attempt to perform arithmetic... +- divideop(1.25,) ...attempt to perform arithmetic... +- divideop('789',) ...attempt to perform arithmetic... +- divideop(1.25,) ...attempt to perform arithmetic... +- divideop('789',) ...attempt to perform arithmetic... +====== % ====== +--- checkallpass +- modop(1.25,1.25) 0 +- modop('789',1.25) 0.25 +- modop(1.25,'789') 1.25 +- modop('789','789') 0 +--- checkallerrors +- modop(nil,1.25) ...attempt to perform arithmetic... +- modop('abc',1.25) ...attempt to perform arithmetic... +- modop(true,1.25) ...attempt to perform arithmetic... +- modop(
,1.25) ...attempt to perform arithmetic... +- modop(,1.25) ...attempt to perform arithmetic... +- modop(,1.25) ...attempt to perform arithmetic... +- modop(nil,'789') ...attempt to perform arithmetic... +- modop('abc','789') ...attempt to perform arithmetic... +- modop(true,'789') ...attempt to perform arithmetic... +- modop(
,'789') ...attempt to perform arithmetic... +- modop(,'789') ...attempt to perform arithmetic... +- modop(,'789') ...attempt to perform arithmetic... +--- checkallerrors +- modop(1.25,nil) ...attempt to perform arithmetic... +- modop('789',nil) ...attempt to perform arithmetic... +- modop(1.25,'abc') ...attempt to perform arithmetic... +- modop('789','abc') ...attempt to perform arithmetic... +- modop(1.25,true) ...attempt to perform arithmetic... +- modop('789',true) ...attempt to perform arithmetic... +- modop(1.25,
) ...attempt to perform arithmetic... +- modop('789',
) ...attempt to perform arithmetic... +- modop(1.25,) ...attempt to perform arithmetic... +- modop('789',) ...attempt to perform arithmetic... +- modop(1.25,) ...attempt to perform arithmetic... +- modop('789',) ...attempt to perform arithmetic... +====== ^ ====== +--- checkallpass +- powerop(2,3) 8 +- powerop('2.5',3) 15.625 +- powerop(2,'3.5') 11.31370... +- powerop('2.5','3.5') 24.70529... +--- checkallerrors +- powerop(nil,3) ...attempt to perform arithmetic... +- powerop('abc',3) ...attempt to perform arithmetic... +- powerop(true,3) ...attempt to perform arithmetic... +- powerop(
,3) ...attempt to perform arithmetic... +- powerop(,3) ...attempt to perform arithmetic... +- powerop(,3) ...attempt to perform arithmetic... +- powerop(nil,'3.1') ...attempt to perform arithmetic... +- powerop('abc','3.1') ...attempt to perform arithmetic... +- powerop(true,'3.1') ...attempt to perform arithmetic... +- powerop(
,'3.1') ...attempt to perform arithmetic... +- powerop(,'3.1') ...attempt to perform arithmetic... +- powerop(,'3.1') ...attempt to perform arithmetic... +--- checkallerrors +- powerop(2,nil) ...attempt to perform arithmetic... +- powerop('2.1',nil) ...attempt to perform arithmetic... +- powerop(2,'abc') ...attempt to perform arithmetic... +- powerop('2.1','abc') ...attempt to perform arithmetic... +- powerop(2,true) ...attempt to perform arithmetic... +- powerop('2.1',true) ...attempt to perform arithmetic... +- powerop(2,
) ...attempt to perform arithmetic... +- powerop('2.1',
) ...attempt to perform arithmetic... +- powerop(2,) ...attempt to perform arithmetic... +- powerop('2.1',) ...attempt to perform arithmetic... +- powerop(2,) ...attempt to perform arithmetic... +- powerop('2.1',) ...attempt to perform arithmetic... +====== == ====== +--- checkallpass +- equalsop(nil,nil) true +- equalsop('abc',nil) false +- equalsop(1.25,nil) false +- equalsop(true,nil) false +- equalsop(
,nil) false +- equalsop(,nil) false +- equalsop(,nil) false +- equalsop(nil,'abc') false +- equalsop('abc','abc') true +- equalsop(1.25,'abc') false +- equalsop(true,'abc') false +- equalsop(
,'abc') false +- equalsop(,'abc') false +- equalsop(,'abc') false +- equalsop(nil,1.25) false +- equalsop('abc',1.25) false +- equalsop(1.25,1.25) true +- equalsop(true,1.25) false +- equalsop(
,1.25) false +- equalsop(,1.25) false +- equalsop(,1.25) false +- equalsop(nil,true) false +- equalsop('abc',true) false +- equalsop(1.25,true) false +- equalsop(true,true) true +- equalsop(
,true) false +- equalsop(,true) false +- equalsop(,true) false +- equalsop(nil,
) false +- equalsop('abc',
) false +- equalsop(1.25,
) false +- equalsop(true,
) false +- equalsop(
,
) true +- equalsop(,
) false +- equalsop(,
) false +- equalsop(nil,) false +- equalsop('abc',) false +- equalsop(1.25,) false +- equalsop(true,) false +- equalsop(
,) false +- equalsop(,) true +- equalsop(,) false +- equalsop(nil,) false +- equalsop('abc',) false +- equalsop(1.25,) false +- equalsop(true,) false +- equalsop(
,) false +- equalsop(,) false +- equalsop(,) true +====== ~= ====== +--- checkallpass +- noteqop(nil,nil) false +- noteqop('abc',nil) true +- noteqop(1.25,nil) true +- noteqop(true,nil) true +- noteqop(
,nil) true +- noteqop(,nil) true +- noteqop(,nil) true +- noteqop(nil,'abc') true +- noteqop('abc','abc') false +- noteqop(1.25,'abc') true +- noteqop(true,'abc') true +- noteqop(
,'abc') true +- noteqop(,'abc') true +- noteqop(,'abc') true +- noteqop(nil,1.25) true +- noteqop('abc',1.25) true +- noteqop(1.25,1.25) false +- noteqop(true,1.25) true +- noteqop(
,1.25) true +- noteqop(,1.25) true +- noteqop(,1.25) true +- noteqop(nil,true) true +- noteqop('abc',true) true +- noteqop(1.25,true) true +- noteqop(true,true) false +- noteqop(
,true) true +- noteqop(,true) true +- noteqop(,true) true +- noteqop(nil,
) true +- noteqop('abc',
) true +- noteqop(1.25,
) true +- noteqop(true,
) true +- noteqop(
,
) false +- noteqop(,
) true +- noteqop(,
) true +- noteqop(nil,) true +- noteqop('abc',) true +- noteqop(1.25,) true +- noteqop(true,) true +- noteqop(
,) true +- noteqop(,) false +- noteqop(,) true +- noteqop(nil,) true +- noteqop('abc',) true +- noteqop(1.25,) true +- noteqop(true,) true +- noteqop(
,) true +- noteqop(,) true +- noteqop(,) false +====== <= ====== +--- checkallpass +- leop(1.25,1.25) true +--- checkallpass +- leop('abc','abc') true +- leop('789','abc') true +- leop('abc','789') false +- leop('789','789') true +--- checkallerrors +- leop(nil,1.25) ...attempt to compare... +- leop('abc',1.25) ...attempt to compare... +- leop(true,1.25) ...attempt to compare... +- leop(
,1.25) ...attempt to compare... +- leop(,1.25) ...attempt to compare... +- leop(,1.25) ...attempt to compare... +--- checkallerrors +- leop('789',1.25) ...attempt to compare... +--- checkallerrors +- leop(nil,'abc') ...attempt to compare... +- leop(true,'abc') ...attempt to compare... +- leop(
,'abc') ...attempt to compare... +- leop(,'abc') ...attempt to compare... +- leop(,'abc') ...attempt to compare... +- leop(nil,'789') ...attempt to compare... +- leop(true,'789') ...attempt to compare... +- leop(
,'789') ...attempt to compare... +- leop(,'789') ...attempt to compare... +- leop(,'789') ...attempt to compare... +--- checkallerrors +- leop(1.25,nil) ...attempt to compare... +- leop(1.25,'abc') ...attempt to compare... +- leop(1.25,true) ...attempt to compare... +- leop(1.25,
) ...attempt to compare... +- leop(1.25,) ...attempt to compare... +- leop(1.25,) ...attempt to compare... +--- checkallerrors +- leop(1.25,'789') ...attempt to compare... +--- checkallerrors +- leop('abc',nil) ...attempt to compare... +- leop('789',nil) ...attempt to compare... +- leop('abc',true) ...attempt to compare... +- leop('789',true) ...attempt to compare... +- leop('abc',
) ...attempt to compare... +- leop('789',
) ...attempt to compare... +- leop('abc',) ...attempt to compare... +- leop('789',) ...attempt to compare... +- leop('abc',) ...attempt to compare... +- leop('789',) ...attempt to compare... +====== >= ====== +--- checkallpass +- geop(1.25,1.25) true +--- checkallpass +- geop('abc','abc') true +- geop('789','abc') false +- geop('abc','789') true +- geop('789','789') true +--- checkallerrors +- geop(nil,1.25) ...attempt to compare... +- geop('abc',1.25) ...attempt to compare... +- geop(true,1.25) ...attempt to compare... +- geop(
,1.25) ...attempt to compare... +- geop(,1.25) ...attempt to compare... +- geop(,1.25) ...attempt to compare... +--- checkallerrors +- geop('789',1.25) ...attempt to compare... +--- checkallerrors +- geop(nil,'abc') ...attempt to compare... +- geop(true,'abc') ...attempt to compare... +- geop(
,'abc') ...attempt to compare... +- geop(,'abc') ...attempt to compare... +- geop(,'abc') ...attempt to compare... +- geop(nil,'789') ...attempt to compare... +- geop(true,'789') ...attempt to compare... +- geop(
,'789') ...attempt to compare... +- geop(,'789') ...attempt to compare... +- geop(,'789') ...attempt to compare... +--- checkallerrors +- geop(1.25,nil) ...attempt to compare... +- geop(1.25,'abc') ...attempt to compare... +- geop(1.25,true) ...attempt to compare... +- geop(1.25,
) ...attempt to compare... +- geop(1.25,) ...attempt to compare... +- geop(1.25,) ...attempt to compare... +--- checkallerrors +- geop(1.25,'789') ...attempt to compare... +--- checkallerrors +- geop('abc',nil) ...attempt to compare... +- geop('789',nil) ...attempt to compare... +- geop('abc',true) ...attempt to compare... +- geop('789',true) ...attempt to compare... +- geop('abc',
) ...attempt to compare... +- geop('789',
) ...attempt to compare... +- geop('abc',) ...attempt to compare... +- geop('789',) ...attempt to compare... +- geop('abc',) ...attempt to compare... +- geop('789',) ...attempt to compare... +====== < ====== +--- checkallpass +- ltop(1.25,1.25) false +--- checkallpass +- ltop('abc','abc') false +- ltop('789','abc') true +- ltop('abc','789') false +- ltop('789','789') false +--- checkallerrors +- ltop(nil,1.25) ...attempt to compare... +- ltop('abc',1.25) ...attempt to compare... +- ltop(true,1.25) ...attempt to compare... +- ltop(
,1.25) ...attempt to compare... +- ltop(,1.25) ...attempt to compare... +- ltop(,1.25) ...attempt to compare... +--- checkallerrors +- ltop('789',1.25) ...attempt to compare... +--- checkallerrors +- ltop(nil,'abc') ...attempt to compare... +- ltop(true,'abc') ...attempt to compare... +- ltop(
,'abc') ...attempt to compare... +- ltop(,'abc') ...attempt to compare... +- ltop(,'abc') ...attempt to compare... +- ltop(nil,'789') ...attempt to compare... +- ltop(true,'789') ...attempt to compare... +- ltop(
,'789') ...attempt to compare... +- ltop(,'789') ...attempt to compare... +- ltop(,'789') ...attempt to compare... +--- checkallerrors +- ltop(1.25,nil) ...attempt to compare... +- ltop(1.25,'abc') ...attempt to compare... +- ltop(1.25,true) ...attempt to compare... +- ltop(1.25,
) ...attempt to compare... +- ltop(1.25,) ...attempt to compare... +- ltop(1.25,) ...attempt to compare... +--- checkallerrors +- ltop(1.25,'789') ...attempt to compare... +--- checkallerrors +- ltop('abc',nil) ...attempt to compare... +- ltop('789',nil) ...attempt to compare... +- ltop('abc',true) ...attempt to compare... +- ltop('789',true) ...attempt to compare... +- ltop('abc',
) ...attempt to compare... +- ltop('789',
) ...attempt to compare... +- ltop('abc',) ...attempt to compare... +- ltop('789',) ...attempt to compare... +- ltop('abc',) ...attempt to compare... +- ltop('789',) ...attempt to compare... +====== > ====== +--- checkallpass +- gtop(1.25,1.25) false +--- checkallpass +- gtop('abc','abc') false +- gtop('789','abc') false +- gtop('abc','789') true +- gtop('789','789') false +--- checkallerrors +- gtop(nil,1.25) ...attempt to compare... +- gtop('abc',1.25) ...attempt to compare... +- gtop(true,1.25) ...attempt to compare... +- gtop(
,1.25) ...attempt to compare... +- gtop(,1.25) ...attempt to compare... +- gtop(,1.25) ...attempt to compare... +--- checkallerrors +- gtop('789',1.25) ...attempt to compare... +--- checkallerrors +- gtop(nil,'abc') ...attempt to compare... +- gtop(true,'abc') ...attempt to compare... +- gtop(
,'abc') ...attempt to compare... +- gtop(,'abc') ...attempt to compare... +- gtop(,'abc') ...attempt to compare... +- gtop(nil,'789') ...attempt to compare... +- gtop(true,'789') ...attempt to compare... +- gtop(
,'789') ...attempt to compare... +- gtop(,'789') ...attempt to compare... +- gtop(,'789') ...attempt to compare... +--- checkallerrors +- gtop(1.25,nil) ...attempt to compare... +- gtop(1.25,'abc') ...attempt to compare... +- gtop(1.25,true) ...attempt to compare... +- gtop(1.25,
) ...attempt to compare... +- gtop(1.25,) ...attempt to compare... +- gtop(1.25,) ...attempt to compare... +--- checkallerrors +- gtop(1.25,'789') ...attempt to compare... +--- checkallerrors +- gtop('abc',nil) ...attempt to compare... +- gtop('789',nil) ...attempt to compare... +- gtop('abc',true) ...attempt to compare... +- gtop('789',true) ...attempt to compare... +- gtop('abc',
) ...attempt to compare... +- gtop('789',
) ...attempt to compare... +- gtop('abc',) ...attempt to compare... +- gtop('789',) ...attempt to compare... +- gtop('abc',) ...attempt to compare... +- gtop('789',) ...attempt to compare... +====== [] ====== +--- checkallpass +- bracketop(
,'abc') +- bracketop(
,1.25) +- bracketop(
,true) +- bracketop(
,
) +- bracketop(
,) +- bracketop(
,) +--- checkallerrors +- bracketop(nil,'abc') ...attempt to index... +needcheck bracketop('abc','abc') nil +- bracketop(1.25,'abc') ...attempt to index... +- bracketop(true,'abc') ...attempt to index... +- bracketop(,'abc') ...attempt to index... +- bracketop(,'abc') ...attempt to index... +- bracketop(nil,1.25) ...attempt to index... +needcheck bracketop('abc',1.25) nil +- bracketop(1.25,1.25) ...attempt to index... +- bracketop(true,1.25) ...attempt to index... +- bracketop(,1.25) ...attempt to index... +- bracketop(,1.25) ...attempt to index... +- bracketop(nil,true) ...attempt to index... +needcheck bracketop('abc',true) nil +- bracketop(1.25,true) ...attempt to index... +- bracketop(true,true) ...attempt to index... +- bracketop(,true) ...attempt to index... +- bracketop(,true) ...attempt to index... +- bracketop(nil,
) ...attempt to index... +needcheck bracketop('abc',
) nil +- bracketop(1.25,
) ...attempt to index... +- bracketop(true,
) ...attempt to index... +- bracketop(,
) ...attempt to index... +- bracketop(,
) ...attempt to index... +- bracketop(nil,) ...attempt to index... +needcheck bracketop('abc',) nil +- bracketop(1.25,) ...attempt to index... +- bracketop(true,) ...attempt to index... +- bracketop(,) ...attempt to index... +- bracketop(,) ...attempt to index... +- bracketop(nil,) ...attempt to index... +needcheck bracketop('abc',) nil +- bracketop(1.25,) ...attempt to index... +- bracketop(true,) ...attempt to index... +- bracketop(,) ...attempt to index... +- bracketop(,) ...attempt to index... +--- checkallerrors +needcheck bracketop(
) nil +====== . ====== +--- checkallpass +- dotop(
,'abc') +- dotop(
,1.25) +- dotop(
,true) +- dotop(
,
) +- dotop(
,) +- dotop(
,) +--- checkallerrors +- dotop(nil,'abc') ...attempt to index... +needcheck dotop('abc','abc') nil +- dotop(1.25,'abc') ...attempt to index... +- dotop(true,'abc') ...attempt to index... +- dotop(,'abc') ...attempt to index... +- dotop(,'abc') ...attempt to index... +- dotop(nil,1.25) ...attempt to index... +needcheck dotop('abc',1.25) nil +- dotop(1.25,1.25) ...attempt to index... +- dotop(true,1.25) ...attempt to index... +- dotop(,1.25) ...attempt to index... +- dotop(,1.25) ...attempt to index... +- dotop(nil,true) ...attempt to index... +needcheck dotop('abc',true) nil +- dotop(1.25,true) ...attempt to index... +- dotop(true,true) ...attempt to index... +- dotop(,true) ...attempt to index... +- dotop(,true) ...attempt to index... +- dotop(nil,
) ...attempt to index... +needcheck dotop('abc',
) nil +- dotop(1.25,
) ...attempt to index... +- dotop(true,
) ...attempt to index... +- dotop(,
) ...attempt to index... +- dotop(,
) ...attempt to index... +- dotop(nil,) ...attempt to index... +needcheck dotop('abc',) nil +- dotop(1.25,) ...attempt to index... +- dotop(true,) ...attempt to index... +- dotop(,) ...attempt to index... +- dotop(,) ...attempt to index... +- dotop(nil,) ...attempt to index... +needcheck dotop('abc',) nil +- dotop(1.25,) ...attempt to index... +- dotop(true,) ...attempt to index... +- dotop(,) ...attempt to index... +- dotop(,) ...attempt to index... +--- checkallerrors +needcheck dotop(
) nil +====== and ====== +--- checkallpass +- andop(nil,nil) +- andop('abc',nil) +- andop(1.25,nil) +- andop(true,nil) +- andop(
,nil) +- andop(,nil) +- andop(,nil) +- andop(nil,'abc') +- andop('abc','abc') 'abc' +- andop(1.25,'abc') 'abc' +- andop(true,'abc') 'abc' +- andop(
,'abc') 'abc' +- andop(,'abc') 'abc' +- andop(,'abc') 'abc' +- andop(nil,1.25) +- andop('abc',1.25) 1.25 +- andop(1.25,1.25) 1.25 +- andop(true,1.25) 1.25 +- andop(
,1.25) 1.25 +- andop(,1.25) 1.25 +- andop(,1.25) 1.25 +- andop(nil,true) +- andop('abc',true) true +- andop(1.25,true) true +- andop(true,true) true +- andop(
,true) true +- andop(,true) true +- andop(,true) true +- andop(nil,
) +- andop('abc',
) 'table' +- andop(1.25,
) 'table' +- andop(true,
) 'table' +- andop(
,
) 'table' +- andop(,
) 'table' +- andop(,
) 'table' +- andop(nil,) +- andop('abc',) 'function' +- andop(1.25,) 'function' +- andop(true,) 'function' +- andop(
,) 'function' +- andop(,) 'function' +- andop(,) 'function' +- andop(nil,) +- andop('abc',) 'thread' +- andop(1.25,) 'thread' +- andop(true,) 'thread' +- andop(
,) 'thread' +- andop(,) 'thread' +- andop(,) 'thread' +====== or ====== +--- checkallpass +- orop(nil,nil) +- orop('abc',nil) 'abc' +- orop(1.25,nil) 1.25 +- orop(true,nil) true +- orop(
,nil) 'table' +- orop(,nil) 'function' +- orop(,nil) 'thread' +- orop(nil,'abc') 'abc' +- orop('abc','abc') 'abc' +- orop(1.25,'abc') 1.25 +- orop(true,'abc') true +- orop(
,'abc') 'table' +- orop(,'abc') 'function' +- orop(,'abc') 'thread' +- orop(nil,1.25) 1.25 +- orop('abc',1.25) 'abc' +- orop(1.25,1.25) 1.25 +- orop(true,1.25) true +- orop(
,1.25) 'table' +- orop(,1.25) 'function' +- orop(,1.25) 'thread' +- orop(nil,true) true +- orop('abc',true) 'abc' +- orop(1.25,true) 1.25 +- orop(true,true) true +- orop(
,true) 'table' +- orop(,true) 'function' +- orop(,true) 'thread' +- orop(nil,
) 'table' +- orop('abc',
) 'abc' +- orop(1.25,
) 1.25 +- orop(true,
) true +- orop(
,
) 'table' +- orop(,
) 'function' +- orop(,
) 'thread' +- orop(nil,) 'function' +- orop('abc',) 'abc' +- orop(1.25,) 1.25 +- orop(true,) true +- orop(
,) 'table' +- orop(,) 'function' +- orop(,) 'thread' +- orop(nil,) 'thread' +- orop('abc',) 'abc' +- orop(1.25,) 1.25 +- orop(true,) true +- orop(
,) 'table' +- orop(,) 'function' +- orop(,) 'thread' +====== for x=a,b,c ====== +--- checkallpass +- forop(1,10,2) +- forop('1.1',10,2) +- forop(1,'10.1',2) +- forop('1.1','10.1',2) +- forop(1,10,'2.1') +- forop('1.1',10,'2.1') +- forop(1,'10.1','2.1') +- forop('1.1','10.1','2.1') +--- checkallerrors +- forop(nil,10,2) ...'for' initial value must be a number... +- forop('abc',10,2) ...'for' initial value must be a number... +- forop(true,10,2) ...'for' initial value must be a number... +- forop(
,10,2) ...'for' initial value must be a number... +- forop(,10,2) ...'for' initial value must be a number... +- forop(,10,2) ...'for' initial value must be a number... +- forop(nil,'10.1',2) ...'for' initial value must be a number... +- forop('abc','10.1',2) ...'for' initial value must be a number... +- forop(true,'10.1',2) ...'for' initial value must be a number... +- forop(
,'10.1',2) ...'for' initial value must be a number... +- forop(,'10.1',2) ...'for' initial value must be a number... +- forop(,'10.1',2) ...'for' initial value must be a number... +- forop(nil,10,'2.1') ...'for' initial value must be a number... +- forop('abc',10,'2.1') ...'for' initial value must be a number... +- forop(true,10,'2.1') ...'for' initial value must be a number... +- forop(
,10,'2.1') ...'for' initial value must be a number... +- forop(,10,'2.1') ...'for' initial value must be a number... +- forop(,10,'2.1') ...'for' initial value must be a number... +- forop(nil,'10.1','2.1') ...'for' initial value must be a number... +- forop('abc','10.1','2.1') ...'for' initial value must be a number... +- forop(true,'10.1','2.1') ...'for' initial value must be a number... +- forop(
,'10.1','2.1') ...'for' initial value must be a number... +- forop(,'10.1','2.1') ...'for' initial value must be a number... +- forop(,'10.1','2.1') ...'for' initial value must be a number... +--- checkallerrors +- forop(1,nil,2) ...'for' limit must be a number... +- forop('1.1',nil,2) ...'for' limit must be a number... +- forop(1,'abc',2) ...'for' limit must be a number... +- forop('1.1','abc',2) ...'for' limit must be a number... +- forop(1,true,2) ...'for' limit must be a number... +- forop('1.1',true,2) ...'for' limit must be a number... +- forop(1,
,2) ...'for' limit must be a number... +- forop('1.1',
,2) ...'for' limit must be a number... +- forop(1,,2) ...'for' limit must be a number... +- forop('1.1',,2) ...'for' limit must be a number... +- forop(1,,2) ...'for' limit must be a number... +- forop('1.1',,2) ...'for' limit must be a number... +- forop(1,nil,'2.1') ...'for' limit must be a number... +- forop('1.1',nil,'2.1') ...'for' limit must be a number... +- forop(1,'abc','2.1') ...'for' limit must be a number... +- forop('1.1','abc','2.1') ...'for' limit must be a number... +- forop(1,true,'2.1') ...'for' limit must be a number... +- forop('1.1',true,'2.1') ...'for' limit must be a number... +- forop(1,
,'2.1') ...'for' limit must be a number... +- forop('1.1',
,'2.1') ...'for' limit must be a number... +- forop(1,,'2.1') ...'for' limit must be a number... +- forop('1.1',,'2.1') ...'for' limit must be a number... +- forop(1,,'2.1') ...'for' limit must be a number... +- forop('1.1',,'2.1') ...'for' limit must be a number... +--- checkallerrors +- forop(1,10,nil) ...'for' step must be a number... +- forop('1.1',10,nil) ...'for' step must be a number... +- forop(1,'10.1',nil) ...'for' step must be a number... +- forop('1.1','10.1',nil) ...'for' step must be a number... +- forop(1,10,'abc') ...'for' step must be a number... +- forop('1.1',10,'abc') ...'for' step must be a number... +- forop(1,'10.1','abc') ...'for' step must be a number... +- forop('1.1','10.1','abc') ...'for' step must be a number... +- forop(1,10,true) ...'for' step must be a number... +- forop('1.1',10,true) ...'for' step must be a number... +- forop(1,'10.1',true) ...'for' step must be a number... +- forop('1.1','10.1',true) ...'for' step must be a number... +- forop(1,10,
) ...'for' step must be a number... +- forop('1.1',10,
) ...'for' step must be a number... +- forop(1,'10.1',
) ...'for' step must be a number... +- forop('1.1','10.1',
) ...'for' step must be a number... +- forop(1,10,) ...'for' step must be a number... +- forop('1.1',10,) ...'for' step must be a number... +- forop(1,'10.1',) ...'for' step must be a number... +- forop('1.1','10.1',) ...'for' step must be a number... +- forop(1,10,) ...'for' step must be a number... +- forop('1.1',10,) ...'for' step must be a number... +- forop(1,'10.1',) ...'for' step must be a number... +- forop('1.1','10.1',) ...'for' step must be a number... diff --git a/luaj-test/src/test/resources/errors/seektest.txt b/luaj-test/src/test/resources/errors/seektest.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/luaj-test/src/test/resources/errors/stringlibargs.out b/luaj-test/src/test/resources/errors/stringlibargs.out new file mode 100644 index 0000000000000000000000000000000000000000..d02c7bd109269a3c3506c998f8935705c266a75e GIT binary patch literal 34227 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 F{{{4m!T$gN literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/errors/tablelibargs.out b/luaj-test/src/test/resources/errors/tablelibargs.out new file mode 100644 index 00000000..8b881a67 --- /dev/null +++ b/luaj-test/src/test/resources/errors/tablelibargs.out @@ -0,0 +1,283 @@ +====== table.concat ====== +--- checkallpass +- table.concat(
) '87654321' +--- checkallpass +- table.concat(
,',') '8,7,6,5,4,3,2,1' +- table.concat(
,1.23) '81.2371.2361.2351.2341.2331.2321.231' +--- checkallpass +- table.concat(
,'-',2) '7-6-5-4-3-2-1' +- table.concat(
,'-','2') '7-6-5-4-3-2-1' +- table.concat(
,'-','2.2') '7-6-5-4-3-2-1' +--- checkallpass +- table.concat(
,'-',2,4) '7-6-5' +- table.concat(
,'-',2,'4') '7-6-5' +- table.concat(
,'-',2,'4.4') '7-6-5' +--- checkallerrors +- table.concat(nil) ...bad argument... +- table.concat('abc') ...bad argument... +- table.concat(1.25) ...bad argument... +- table.concat(true) ...bad argument... +- table.concat() ...bad argument... +- table.concat() ...bad argument... +--- checkallerrors +- table.concat(
) ...boolean... +--- checkallerrors +- table.concat(
,true) ...bad argument... +- table.concat(
,
) ...bad argument... +- table.concat(
,) ...bad argument... +--- checkallerrors +- table.concat(
,'-','abc') ...bad argument... +- table.concat(
,'-',true) ...bad argument... +- table.concat(
,'-',
) ...bad argument... +- table.concat(
,'-',) ...bad argument... +--- checkallerrors +- table.concat(
,'-',2,'abc') ...bad argument... +- table.concat(
,'-',2,true) ...bad argument... +- table.concat(
,'-',2,
) ...bad argument... +- table.concat(
,'-',2,) ...bad argument... +====== table.insert ====== +--- checkallpass +- table.insert(
,'abc') +- table.insert(
,1.25) +- table.insert(
,true) +- table.insert(
,
) +- table.insert(
,) +- table.insert(
,) +--- checkallpass +- table.insert(
,2,'abc') +- table.insert(
,'2','abc') +- table.insert(
,'2.2','abc') +- table.insert(
,2,1.25) +- table.insert(
,'2',1.25) +- table.insert(
,'2.2',1.25) +- table.insert(
,2,true) +- table.insert(
,'2',true) +- table.insert(
,'2.2',true) +- table.insert(
,2,
) +- table.insert(
,'2',
) +- table.insert(
,'2.2',
) +- table.insert(
,2,) +- table.insert(
,'2',) +- table.insert(
,'2.2',) +- table.insert(
,2,) +- table.insert(
,'2',) +- table.insert(
,'2.2',) +--- checkallerrors +- table.insert(nil,'abc') ...bad argument... +- table.insert('abc','abc') ...bad argument... +- table.insert(1.25,'abc') ...bad argument... +- table.insert(true,'abc') ...bad argument... +- table.insert(,'abc') ...bad argument... +- table.insert(,'abc') ...bad argument... +- table.insert(nil,1.25) ...bad argument... +- table.insert('abc',1.25) ...bad argument... +- table.insert(1.25,1.25) ...bad argument... +- table.insert(true,1.25) ...bad argument... +- table.insert(,1.25) ...bad argument... +- table.insert(,1.25) ...bad argument... +--- checkallerrors +- table.insert(
,'abc','abc') ...bad argument... +- table.insert(
,true,'abc') ...bad argument... +- table.insert(
,
,'abc') ...bad argument... +- table.insert(
,,'abc') ...bad argument... +- table.insert(
,'abc',1.25) ...bad argument... +- table.insert(
,true,1.25) ...bad argument... +- table.insert(
,
,1.25) ...bad argument... +- table.insert(
,,1.25) ...bad argument... +- table.insert(
,'abc',true) ...bad argument... +- table.insert(
,true,true) ...bad argument... +- table.insert(
,
,true) ...bad argument... +- table.insert(
,,true) ...bad argument... +- table.insert(
,'abc',
) ...bad argument... +- table.insert(
,true,
) ...bad argument... +- table.insert(
,
,
) ...bad argument... +- table.insert(
,,
) ...bad argument... +- table.insert(
,'abc',) ...bad argument... +- table.insert(
,true,) ...bad argument... +- table.insert(
,
,) ...bad argument... +- table.insert(
,,) ...bad argument... +- table.insert(
,'abc',) ...bad argument... +- table.insert(
,true,) ...bad argument... +- table.insert(
,
,) ...bad argument... +- table.insert(
,,) ...bad argument... +====== table.remove ====== +--- checkallpass +- table.remove(
) +--- checkallpass +- table.remove(
,2) +- table.remove(
,'2') +- table.remove(
,'2.2') +--- checkallerrors +- table.remove(nil) ...bad argument... +- table.remove('abc') ...bad argument... +- table.remove(1.25) ...bad argument... +- table.remove(true) ...bad argument... +- table.remove() ...bad argument... +- table.remove() ...bad argument... +--- checkallerrors +- table.remove(nil,2) ...bad argument... +- table.remove('abc',2) ...bad argument... +- table.remove(1.25,2) ...bad argument... +- table.remove(true,2) ...bad argument... +- table.remove(,2) ...bad argument... +- table.remove(,2) ...bad argument... +- table.remove(nil,'2') ...bad argument... +- table.remove('abc','2') ...bad argument... +- table.remove(1.25,'2') ...bad argument... +- table.remove(true,'2') ...bad argument... +- table.remove(,'2') ...bad argument... +- table.remove(,'2') ...bad argument... +- table.remove(nil,'2.2') ...bad argument... +- table.remove('abc','2.2') ...bad argument... +- table.remove(1.25,'2.2') ...bad argument... +- table.remove(true,'2.2') ...bad argument... +- table.remove(,'2.2') ...bad argument... +- table.remove(,'2.2') ...bad argument... +--- checkallerrors +- table.remove(
,'abc') ...bad argument... +- table.remove(
,true) ...bad argument... +- table.remove(
,
) ...bad argument... +- table.remove(
,) ...bad argument... +====== table.sort ====== +--- checkallpass +- table.sort(
,nil) +- table.sort(
,) +--- checkallerrors +- table.sort(
) ...attempt to... +--- checkallerrors +- table.sort(nil,nil) ...bad argument... +- table.sort('abc',nil) ...bad argument... +- table.sort(1.25,nil) ...bad argument... +- table.sort(true,nil) ...bad argument... +- table.sort(,nil) ...bad argument... +- table.sort(,nil) ...bad argument... +- table.sort(nil,) ...bad argument... +- table.sort('abc',) ...bad argument... +- table.sort(1.25,) ...bad argument... +- table.sort(true,) ...bad argument... +- table.sort(,) ...bad argument... +- table.sort(,) ...bad argument... +--- checkallerrors +- table.sort(
,'abc') ...bad argument... +- table.sort(
,1.25) ...bad argument... +- table.sort(
,true) ...bad argument... +- table.sort(
,
) ...bad argument... +====== table_get - tbl[key] ====== +--- checkallpass +- table_get(
,nil) +- table_get(
,'abc') +- table_get(
,1.25) +- table_get(
,true) +- table_get(
,
) +- table_get(
,) +- table_get(
,) +====== table_set - tbl[key]=val ====== +--- checkallpass +- table_set(
,'abc',nil) +- table_set(
,1.25,nil) +- table_set(
,true,nil) +- table_set(
,
,nil) +- table_set(
,,nil) +- table_set(
,,nil) +- table_set(
,'abc','abc') +- table_set(
,1.25,'abc') +- table_set(
,true,'abc') +- table_set(
,
,'abc') +- table_set(
,,'abc') +- table_set(
,,'abc') +- table_set(
,'abc',1.25) +- table_set(
,1.25,1.25) +- table_set(
,true,1.25) +- table_set(
,
,1.25) +- table_set(
,,1.25) +- table_set(
,,1.25) +- table_set(
,'abc',true) +- table_set(
,1.25,true) +- table_set(
,true,true) +- table_set(
,
,true) +- table_set(
,,true) +- table_set(
,,true) +- table_set(
,'abc',
) +- table_set(
,1.25,
) +- table_set(
,true,
) +- table_set(
,
,
) +- table_set(
,,
) +- table_set(
,,
) +- table_set(
,'abc',) +- table_set(
,1.25,) +- table_set(
,true,) +- table_set(
,
,) +- table_set(
,,) +- table_set(
,,) +- table_set(
,'abc',) +- table_set(
,1.25,) +- table_set(
,true,) +- table_set(
,
,) +- table_set(
,,) +- table_set(
,,) +--- checkallerrors +- table_set_nil_key(
,nil) ...table index... +- table_set_nil_key(
,'abc') ...table index... +- table_set_nil_key(
,1.25) ...table index... +- table_set_nil_key(
,true) ...table index... +- table_set_nil_key(
,
) ...table index... +- table_set_nil_key(
,) ...table index... +- table_set_nil_key(
,) ...table index... +====== table.unpack ====== +--- checkallpass +- table.unpack(
) 'abc',,,,
,
,
,true,true,true,1.25,1.25,1.25,'abc','abc','abc',1.25,true,
, +--- checkallpass +- table.unpack(
,3) ,,
,
,
,true,true,true,1.25,1.25,1.25,'abc','abc','abc',1.25,true,
, +- table.unpack(
,'5')
,
,
,true,true,true,1.25,1.25,1.25,'abc','abc','abc',1.25,true,
, +--- checkallpass +- table.unpack(
,3,1.25) +- table.unpack(
,'5',1.25) +- table.unpack(
,3,'7') ,,
,
,
+- table.unpack(
,'5','7')
,
,
+--- checkallerrors +- table.unpack(nil,1.25,1.25) ...bad argument... +- table.unpack('abc',1.25,1.25) ...bad argument... +- table.unpack(1.25,1.25,1.25) ...bad argument... +- table.unpack(true,1.25,1.25) ...bad argument... +- table.unpack(,1.25,1.25) ...bad argument... +- table.unpack(,1.25,1.25) ...bad argument... +- table.unpack(nil,'789',1.25) ...bad argument... +- table.unpack('abc','789',1.25) ...bad argument... +- table.unpack(1.25,'789',1.25) ...bad argument... +- table.unpack(true,'789',1.25) ...bad argument... +- table.unpack(,'789',1.25) ...bad argument... +- table.unpack(,'789',1.25) ...bad argument... +- table.unpack(nil,1.25,'789') ...bad argument... +- table.unpack('abc',1.25,'789') ...bad argument... +- table.unpack(1.25,1.25,'789') ...bad argument... +- table.unpack(true,1.25,'789') ...bad argument... +- table.unpack(,1.25,'789') ...bad argument... +- table.unpack(,1.25,'789') ...bad argument... +- table.unpack(nil,'789','789') ...bad argument... +- table.unpack('abc','789','789') ...bad argument... +- table.unpack(1.25,'789','789') ...bad argument... +- table.unpack(true,'789','789') ...bad argument... +- table.unpack(,'789','789') ...bad argument... +- table.unpack(,'789','789') ...bad argument... +--- checkallerrors +- table.unpack(
,'abc',1.25) ...bad argument... +- table.unpack(
,true,1.25) ...bad argument... +- table.unpack(
,
,1.25) ...bad argument... +- table.unpack(
,,1.25) ...bad argument... +- table.unpack(
,,1.25) ...bad argument... +- table.unpack(
,'abc','789') ...bad argument... +- table.unpack(
,true,'789') ...bad argument... +- table.unpack(
,
,'789') ...bad argument... +- table.unpack(
,,'789') ...bad argument... +- table.unpack(
,,'789') ...bad argument... +--- checkallerrors +- table.unpack(
,1.25,'abc') ...bad argument... +- table.unpack(
,'789','abc') ...bad argument... +- table.unpack(
,1.25,true) ...bad argument... +- table.unpack(
,'789',true) ...bad argument... +- table.unpack(
,1.25,
) ...bad argument... +- table.unpack(
,'789',
) ...bad argument... +- table.unpack(
,1.25,) ...bad argument... +- table.unpack(
,'789',) ...bad argument... +- table.unpack(
,1.25,) ...bad argument... +- table.unpack(
,'789',) ...bad argument... diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/all.lc b/luaj-test/src/test/resources/lua5.2.1-tests/all.lc new file mode 100644 index 0000000000000000000000000000000000000000..99bea580e5f5ed447e057ef02ffd055aa4a569dc GIT binary patch literal 9193 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 Au>b%7 literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/all.lua b/luaj-test/src/test/resources/lua5.2.1-tests/all.lua new file mode 100644 index 00000000..99a70649 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/all.lua @@ -0,0 +1,236 @@ +#!../lua + +local version = "Lua 5.2" +if _VERSION ~= version then + io.stderr:write("\nThis test suite is for ", version, ", not for ", _VERSION, + "\nExiting tests\n") + return +end + + +-- next variables control the execution of some tests +-- true means no test (so an undefined variable does not skip a test) +-- defaults are for Linux; test everything + +_soft = false -- true to avoid long or memory consuming tests +_port = false -- true to avoid non-portable tests +_no32 = false -- true to avoid tests that assume 32 bits +_nomsg = false -- true to avoid messages about tests not performed +_noposix = false -- false assumes LUA_USE_POSIX +_nolonglong = false -- false assumes LUA_USE_LONGLONG +_noformatA = false -- false assumes LUA_USE_AFORMAT + + +local usertests = rawget(_G, "_U") + +if usertests then + -- tests for sissies ;) Avoid problems + _soft = true + _port = true + _no32 = true + _nomsg = true + _noposix = true + _nolonglong = true + _noformatA = true; +end + +-- no "internal" tests for user tests +if usertests then T = nil end + +T = rawget(_G, "T") -- avoid problems with 'strict' module + +package.path = "?;./?.lua" .. package.path + +math.randomseed(0) + +collectgarbage("setstepmul", 200) +collectgarbage("setpause", 200) + + +--[=[ + example of a long [comment], + [[spanning several [lines]]] + +]=] + +print("current path:\n****" .. package.path .. "****\n") + + +local c = os.clock() + +local collectgarbage = collectgarbage + +do + +-- track messages for tests not performed +local msgs = {} +function Message (m) + if not _nomsg then + print(m) + msgs[#msgs+1] = string.sub(m, 3, -3) + end +end + +assert(os.setlocale"C") + +local T,print,format,write,assert,type,unpack,floor = + T,print,string.format,io.write,assert,type,table.unpack,math.floor + +-- use K for 1000 and M for 1000000 (not 2^10 -- 2^20) +local function F (m) + local function round (m) + m = m + 0.04999 + return m - (m % 0.1) -- keep one decimal digit + end + if m < 1000 then return m + else + m = m / 1000 + if m < 1000 then return round(m).."K" + else + return round(m/1000).."M" + end + end +end + +local showmem +if not T then + local max = 0 + showmem = function () + local m = collectgarbage("count") * 1024 + max = (m > max) and m or max + print(format(" ---- total memory: %s, max memory: %s ----\n", + F(m), F(max))) + end +else + showmem = function () + T.checkmemory() + local total, numblocks, maxmem = T.totalmem() + local count = collectgarbage("count") + print(format( + "\n ---- total memory: %s (%.0fK), max use: %s, blocks: %d\n", + F(total), count, F(maxmem), numblocks)) + print(format("\t(strings: %d, tables: %d, functions: %d, ".. + "\n\tudata: %d, threads: %d)", + T.totalmem"string", T.totalmem"table", T.totalmem"function", + T.totalmem"userdata", T.totalmem"thread")) + end +end + + +-- +-- redefine dofile to run files through dump/undump +-- +local function report (n) print("\n***** FILE '"..n.."'*****") end +local olddofile = dofile +dofile = function (n) + showmem() + report(n) + local f = assert(loadfile(n)) + local b = string.dump(f) + f = assert(load(b)) + return f() +end + +dofile('main.lua') + +do + local eph = setmetatable({}, {__mode = "k"}) -- create an ephemeron table + local next, setmetatable, stderr = next, setmetatable, io.stderr + local mt = {} + -- each time a table is collected, create a new one to be + -- collected next cycle + mt.__gc = function (o) + stderr:write'.' -- mark progress + -- assert(eph[o]() == o and next(eph) == o and next(eph, o) == nil) + local n = setmetatable({}, mt) -- replicate object + eph[n] = function () return n end + o = nil + local a,b,c,d,e = nil -- erase 'o' from the stack + end + local n = setmetatable({}, mt) -- replicate object + eph[n] = function () return n end +end + +report"gc.lua" +local f = assert(loadfile('gc.lua')) +f() + +collectgarbage("generational") +dofile('db.lua') +assert(dofile('calls.lua') == deep and deep) +olddofile('strings.lua') +olddofile('literals.lua') +assert(dofile('attrib.lua') == 27) + +collectgarbage("incremental") -- redo some tests in incremental mode +olddofile('strings.lua') +olddofile('literals.lua') +dofile('constructs.lua') +dofile('api.lua') + +collectgarbage("generational") -- back to generational mode +collectgarbage("setpause", 200) +collectgarbage("setmajorinc", 500) +assert(dofile('locals.lua') == 5) +dofile('constructs.lua') +dofile('code.lua') +if not _G._soft then + report('big.lua') + local f = coroutine.wrap(assert(loadfile('big.lua'))) + assert(f() == 'b') + assert(f() == 'a') +end +dofile('nextvar.lua') +dofile('pm.lua') +dofile('api.lua') +assert(dofile('events.lua') == 12) +dofile('vararg.lua') +dofile('closure.lua') +dofile('coroutine.lua') +dofile('goto.lua') +dofile('errors.lua') +dofile('math.lua') +dofile('sort.lua') +dofile('bitwise.lua') +assert(dofile('verybig.lua') == 10); collectgarbage() +dofile('files.lua') + +if #msgs > 0 then + print("\ntests not performed:") + for i=1,#msgs do + print(msgs[i]) + end + print() +end + +print("final OK !!!") + +local debug = require "debug" + +debug.sethook(function (a) assert(type(a) == 'string') end, "cr") + +-- to survive outside block +_G.showmem = showmem + +end + +local _G, showmem, print, format, clock = + _G, showmem, print, string.format, os.clock + +-- erase (almost) all globals +print('cleaning all!!!!') +for n in pairs(_G) do + if not ({___Glob = 1, tostring = 1})[n] then + _G[n] = nil + end +end + + +collectgarbage() +collectgarbage() +collectgarbage() +collectgarbage() +collectgarbage() +collectgarbage();showmem() + +print(format("\n\ntotal time: %.2f\n", clock()-c)) diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/api.lc b/luaj-test/src/test/resources/lua5.2.1-tests/api.lc new file mode 100644 index 0000000000000000000000000000000000000000..ba78d8c53c8d0fdf8e93eb3fee03d0b9c77116e6 GIT binary patch literal 54535 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 testC not active: skipping API tests <<<\n\a') + return +end + +local debug = require "debug" + +local pack = table.pack + + +function tcheck (t1, t2) + assert(t1.n == (t2.n or #t2) + 1) + for i = 2, t1.n do assert(t1[i] == t2[i - 1]) end +end + + +print('testing C API') + +a = T.testC("pushvalue R; return 1") +assert(a == debug.getregistry()) + + +-- absindex +assert(T.testC("settop 10; absindex -1; return 1") == 10) +assert(T.testC("settop 5; absindex -5; return 1") == 1) +assert(T.testC("settop 10; absindex 1; return 1") == 1) +assert(T.testC("settop 10; absindex R; return 1") < -10) + +-- testing allignment +a = T.d2s(12458954321123) +assert(string.len(a) == 8) -- sizeof(double) +assert(T.s2d(a) == 12458954321123) + +a,b,c = T.testC("pushnum 1; pushnum 2; pushnum 3; return 2") +assert(a == 2 and b == 3 and not c) + +f = T.makeCfunc("pushnum 1; pushnum 2; pushnum 3; return 2") +a,b,c = f() +assert(a == 2 and b == 3 and not c) + +-- test that all trues are equal +a,b,c = T.testC("pushbool 1; pushbool 2; pushbool 0; return 3") +assert(a == b and a == true and c == false) +a,b,c = T.testC"pushbool 0; pushbool 10; pushnil;\ + tobool -3; tobool -3; tobool -3; return 3" +assert(a==false and b==true and c==false) + + +a,b,c = T.testC("gettop; return 2", 10, 20, 30, 40) +assert(a == 40 and b == 5 and not c) + +t = pack(T.testC("settop 5; gettop; return .", 2, 3)) +tcheck(t, {n=4,2,3}) + +t = pack(T.testC("settop 0; settop 15; return 10", 3, 1, 23)) +assert(t.n == 10 and t[1] == nil and t[10] == nil) + +t = pack(T.testC("remove -2; gettop; return .", 2, 3, 4)) +tcheck(t, {n=2,2,4}) + +t = pack(T.testC("insert -1; gettop; return .", 2, 3)) +tcheck(t, {n=2,2,3}) + +t = pack(T.testC("insert 3; gettop; return .", 2, 3, 4, 5)) +tcheck(t, {n=4,2,5,3,4}) + +t = pack(T.testC("replace 2; gettop; return .", 2, 3, 4, 5)) +tcheck(t, {n=3,5,3,4}) + +t = pack(T.testC("replace -2; gettop; return .", 2, 3, 4, 5)) +tcheck(t, {n=3,2,3,5}) + +t = pack(T.testC("remove 3; gettop; return .", 2, 3, 4, 5)) +tcheck(t, {n=3,2,4,5}) + +t = pack(T.testC("copy 3 4; gettop; return .", 2, 3, 4, 5)) +tcheck(t, {n=4,2,3,3,5}) + +t = pack(T.testC("copy -3 -1; gettop; return .", 2, 3, 4, 5)) +tcheck(t, {n=4,2,3,4,3}) + + + + +t = pack(T.testC("insert 3; pushvalue 3; remove 3; pushvalue 2; remove 2; \ + insert 2; pushvalue 1; remove 1; insert 1; \ + insert -2; pushvalue -2; remove -3; gettop; return .", + 2, 3, 4, 5, 10, 40, 90)) +tcheck(t, {n=7,2,3,4,5,10,40,90}) + +t = pack(T.testC("concat 5; gettop; return .", "alo", 2, 3, "joao", 12)) +tcheck(t, {n=1,"alo23joao12"}) + +-- testing MULTRET +t = pack(T.testC("call 2,-1; gettop; return .", + function (a,b) return 1,2,3,4,a,b end, "alo", "joao")) +tcheck(t, {n=6,1,2,3,4,"alo", "joao"}) + +do -- test returning more results than fit in the caller stack + local a = {} + for i=1,1000 do a[i] = true end; a[999] = 10 + local b = T.testC([[pcall 1 -1; pop 1; tostring -1; return 1]], + table.unpack, a) + assert(b == "10") +end + + +-- testing globals +_G.a = 14; _G.b = "a31" +local a = {T.testC[[ + getglobal a; + getglobal b; + getglobal b; + setglobal a; + gettop; + return . +]]} +assert(a[2] == 14 and a[3] == "a31" and a[4] == nil and _G.a == "a31") + + +-- testing arith +assert(T.testC("pushnum 10; pushnum 20; arith /; return 1") == 0.5) +assert(T.testC("pushnum 10; pushnum 20; arith -; return 1") == -10) +assert(T.testC("pushnum 10; pushnum -20; arith *; return 1") == -200) +assert(T.testC("pushnum 10; pushnum 3; arith ^; return 1") == 1000) +assert(T.testC("pushnum 10; pushstring 20; arith /; return 1") == 0.5) +assert(T.testC("pushstring 10; pushnum 20; arith -; return 1") == -10) +assert(T.testC("pushstring 10; pushstring -20; arith *; return 1") == -200) +assert(T.testC("pushstring 10; pushstring 3; arith ^; return 1") == 1000) +a,b,c = T.testC([[pushnum 1; + pushstring 10; arith _; + pushstring 5; return 3]]) +assert(a == 1 and b == -10 and c == "5") +mt = {__add = function (a,b) return setmetatable({a[1] + b[1]}, mt) end, + __mod = function (a,b) return setmetatable({a[1] % b[1]}, mt) end, + __unm = function (a) return setmetatable({a[1]* 2}, mt) end} +a,b,c = setmetatable({4}, mt), + setmetatable({8}, mt), + setmetatable({-3}, mt) +x,y,z = T.testC("arith +; return 2", 10, a, b) +assert(x == 10 and y[1] == 12 and z == nil) +assert(T.testC("arith %; return 1", a, c)[1] == 4%-3) +assert(T.testC("arith _; arith +; arith %; return 1", b, a, c)[1] == + 8 % (4 + (-3)*2)) + + +-- testing compare +-- EQ = 0; LT = 1; LE = 2 + +-- testing lessthan and lessequal +assert(T.testC("compare 2 5 1, return 1", 3, 2, 2, 4, 2, 2)) +assert(T.testC("compare 2 5 2, return 1", 3, 2, 2, 4, 2, 2)) +assert(not T.testC("compare 3 4 1, return 1", 3, 2, 2, 4, 2, 2)) +assert(T.testC("compare 3 4 2, return 1", 3, 2, 2, 4, 2, 2)) +assert(T.testC("compare 5 2 1, return 1", 4, 2, 2, 3, 2, 2)) +assert(not T.testC("compare 2 -3 1, return 1", "4", "2", "2", "3", "2", "2")) +assert(not T.testC("compare -3 2 1, return 1", "3", "2", "2", "4", "2", "2")) + +-- non-valid indices produce false +assert(not T.testC("compare 1 4 1, return 1")) +assert(not T.testC("compare 9 1 2, return 1")) +assert(not T.testC("compare 9 9 0, return 1")) + +local b = {__lt = function (a,b) return a[1] < b[1] end} +local a1,a3,a4 = setmetatable({1}, b), + setmetatable({3}, b), + setmetatable({4}, b) +assert(T.testC("compare 2 5 1, return 1", a3, 2, 2, a4, 2, 2)) +assert(T.testC("compare 2 5 2, return 1", a3, 2, 2, a4, 2, 2)) +assert(T.testC("compare 5 -6 1, return 1", a4, 2, 2, a3, 2, 2)) +a,b = T.testC("compare 5 -6 1, return 2", a1, 2, 2, a3, 2, 20) +assert(a == 20 and b == false) +a,b = T.testC("compare 5 -6 2, return 2", a1, 2, 2, a3, 2, 20) +assert(a == 20 and b == false) +a,b = T.testC("compare 5 -6 2, return 2", a1, 2, 2, a1, 2, 20) +assert(a == 20 and b == true) + +-- testing length +local t = setmetatable({x = 20}, {__len = function (t) return t.x end}) +a,b,c = T.testC([[ + len 2; + Llen 2; + objsize 2; + return 3 +]], t) +assert(a == 20 and b == 20 and c == 0) + +t.x = "234"; t[1] = 20 +a,b,c = T.testC([[ + len 2; + Llen 2; + objsize 2; + return 3 +]], t) +assert(a == "234" and b == 234 and c == 1) + +t.x = print; t[1] = 20 +a,c = T.testC([[ + len 2; + objsize 2; + return 2 +]], t) +assert(a == print and c == 1) + + +-- testing __concat + +a = setmetatable({x="u"}, {__concat = function (a,b) return a.x..'.'..b.x end}) +x,y = T.testC([[ + pushnum 5 + pushvalue 2; + pushvalue 2; + concat 2; + pushvalue -2; + return 2; +]], a, a) +assert(x == a..a and y == 5) + +-- concat with 0 elements +assert(T.testC("concat 0; return 1") == "") + +-- concat with 1 element +assert(T.testC("concat 1; return 1", "xuxu") == "xuxu") + + + +-- testing lua_is + +function B(x) return x and 1 or 0 end + +function count (x, n) + n = n or 2 + local prog = [[ + isnumber %d; + isstring %d; + isfunction %d; + iscfunction %d; + istable %d; + isuserdata %d; + isnil %d; + isnull %d; + return 8 + ]] + prog = string.format(prog, n, n, n, n, n, n, n, n) + local a,b,c,d,e,f,g,h = T.testC(prog, x) + return B(a)+B(b)+B(c)+B(d)+B(e)+B(f)+B(g)+(100*B(h)) +end + +assert(count(3) == 2) +assert(count('alo') == 1) +assert(count('32') == 2) +assert(count({}) == 1) +assert(count(print) == 2) +assert(count(function () end) == 1) +assert(count(nil) == 1) +assert(count(io.stdin) == 1) +assert(count(nil, 15) == 100) + + +-- testing lua_to... + +function to (s, x, n) + n = n or 2 + return T.testC(string.format("%s %d; return 1", s, n), x) +end + +assert(to("tostring", {}) == nil) +assert(to("tostring", "alo") == "alo") +assert(to("tostring", 12) == "12") +assert(to("tostring", 12, 3) == nil) +assert(to("objsize", {}) == 0) +assert(to("objsize", {1,2,3}) == 3) +assert(to("objsize", "alo\0\0a") == 6) +assert(to("objsize", T.newuserdata(0)) == 0) +assert(to("objsize", T.newuserdata(101)) == 101) +assert(to("objsize", 124) == 0) +assert(to("objsize", true) == 0) +assert(to("tonumber", {}) == 0) +assert(to("tonumber", "12") == 12) +assert(to("tonumber", "s2") == 0) +assert(to("tonumber", 1, 20) == 0) +assert(to("topointer", 10) == 0) +assert(to("topointer", true) == 0) +assert(to("topointer", T.pushuserdata(20)) == 20) +assert(to("topointer", io.read) ~= 0) +assert(to("func2num", 20) == 0) +assert(to("func2num", T.pushuserdata(10)) == 0) +assert(to("func2num", io.read) ~= 0) +a = to("tocfunction", math.deg) +assert(a(3) == math.deg(3) and a == math.deg) + + + +-- testing deep C stack +do + collectgarbage("stop") + local s, msg = pcall(T.testC, "checkstack 1000023 XXXX") -- too deep + assert(not s and string.find(msg, "XXXX")) + s = string.rep("pushnil;checkstack 1 XX;", 1000000) + s, msg = pcall(T.testC, s) + assert(not s and string.find(msg, "XX")) + collectgarbage("restart") +end + +local prog = {"checkstack 30000 msg", "newtable"} +for i = 1,12000 do + prog[#prog + 1] = "pushnum " .. i + prog[#prog + 1] = "pushnum " .. i * 10 +end + +prog[#prog + 1] = "rawgeti R 2" -- get global table in registry +prog[#prog + 1] = "insert " .. -(2*12000 + 2) + +for i = 1,12000 do + prog[#prog + 1] = "settable " .. -(2*(12000 - i + 1) + 1) +end + +prog[#prog + 1] = "return 2" + +prog = table.concat(prog, ";") +local g, t = T.testC(prog) +assert(g == _G) +for i = 1,12000 do assert(t[i] == i*10); t[i] = nil end +assert(next(t) == nil) +prog, g, t = nil + +-- testing errors + +a = T.testC([[ + loadstring 2; pcall 0,1; + pushvalue 3; insert -2; pcall 1, 1; + pcall 0, 0; + return 1 +]], "x=150", function (a) assert(a==nil); return 3 end) + +assert(type(a) == 'string' and x == 150) + +function check3(p, ...) + local arg = {...} + assert(#arg == 3) + assert(string.find(arg[3], p)) +end +check3(":1:", T.testC("loadstring 2; gettop; return .", "x=")) +check3("cannot read", T.testC("loadfile 2; gettop; return .", ".")) +check3("cannot open xxxx", T.testC("loadfile 2; gettop; return .", "xxxx")) + +-- test errors in non protected threads +function checkerrnopro (code, msg) + L = coroutine.create(function () end) + local stt, err = pcall(T.testC, code) + assert(not stt and string.find(err, msg)) +end + +checkerrnopro("pushnum 3; call 0 0", "attempt to call") +function f () f() end +checkerrnopro("getglobal 'f'; call 0 0;", "stack overflow") + + +-- testing table access + +a = {x=0, y=12} +x, y = T.testC("gettable 2; pushvalue 4; gettable 2; return 2", + a, 3, "y", 4, "x") +assert(x == 0 and y == 12) +T.testC("settable -5", a, 3, 4, "x", 15) +assert(a.x == 15) +a[a] = print +x = T.testC("gettable 2; return 1", a) -- table and key are the same object! +assert(x == print) +T.testC("settable 2", a, "x") -- table and key are the same object! +assert(a[a] == "x") + +b = setmetatable({p = a}, {}) +getmetatable(b).__index = function (t, i) return t.p[i] end +k, x = T.testC("gettable 3, return 2", 4, b, 20, 35, "x") +assert(x == 15 and k == 35) +getmetatable(b).__index = function (t, i) return a[i] end +getmetatable(b).__newindex = function (t, i,v ) a[i] = v end +y = T.testC("insert 2; gettable -5; return 1", 2, 3, 4, "y", b) +assert(y == 12) +k = T.testC("settable -5, return 1", b, 3, 4, "x", 16) +assert(a.x == 16 and k == 4) +a[b] = 'xuxu' +y = T.testC("gettable 2, return 1", b) +assert(y == 'xuxu') +T.testC("settable 2", b, 19) +assert(a[b] == 19) + +-- testing next +a = {} +t = pack(T.testC("next; gettop; return .", a, nil)) +tcheck(t, {n=1,a}) +a = {a=3} +t = pack(T.testC("next; gettop; return .", a, nil)) +tcheck(t, {n=3,a,'a',3}) +t = pack(T.testC("next; pop 1; next; gettop; return .", a, nil)) +tcheck(t, {n=1,a}) + + + +-- testing upvalues + +do + local A = T.testC[[ pushnum 10; pushnum 20; pushcclosure 2; return 1]] + t, b, c = A([[pushvalue U0; pushvalue U1; pushvalue U2; return 3]]) + assert(b == 10 and c == 20 and type(t) == 'table') + a, b = A([[tostring U3; tonumber U4; return 2]]) + assert(a == nil and b == 0) + A([[pushnum 100; pushnum 200; replace U2; replace U1]]) + b, c = A([[pushvalue U1; pushvalue U2; return 2]]) + assert(b == 100 and c == 200) + A([[replace U2; replace U1]], {x=1}, {x=2}) + b, c = A([[pushvalue U1; pushvalue U2; return 2]]) + assert(b.x == 1 and c.x == 2) + T.checkmemory() +end + + +-- testing absent upvalues from C-function pointers +assert(T.testC[[isnull U1; return 1]] == true) +assert(T.testC[[isnull U100; return 1]] == true) +assert(T.testC[[pushvalue U1; return 1]] == nil) + +local f = T.testC[[ pushnum 10; pushnum 20; pushcclosure 2; return 1]] +assert(T.upvalue(f, 1) == 10 and + T.upvalue(f, 2) == 20 and + T.upvalue(f, 3) == nil) +T.upvalue(f, 2, "xuxu") +assert(T.upvalue(f, 2) == "xuxu") + + +-- large closures +do + local A = "checkstack 300 msg;" .. + string.rep("pushnum 10;", 255) .. + "pushcclosure 255; return 1" + A = T.testC(A) + for i=1,255 do + assert(A(("pushvalue U%d; return 1"):format(i)) == 10) + end + assert(A("isnull U256; return 1")) + assert(not A("isnil U256; return 1")) +end + + + +-- bug in 5.1.2 +assert(not pcall(debug.setuservalue, 3, {})) +assert(not pcall(debug.setuservalue, nil, {})) +assert(not pcall(debug.setuservalue, T.pushuserdata(1), {})) + +local b = T.newuserdata(0) +local a = {} +assert(debug.getuservalue(b) == nil) +assert(debug.setuservalue(b, a)) +assert(debug.getuservalue(b) == a) +assert(debug.setuservalue(b, nil)) +assert(debug.getuservalue(b) == nil) + +assert(debug.getuservalue(4) == nil) + + + +-- testing locks (refs) + +-- reuse of references +local i = T.ref{} +T.unref(i) +assert(T.ref{} == i) + +Arr = {} +Lim = 100 +for i=1,Lim do -- lock many objects + Arr[i] = T.ref({}) +end + +assert(T.ref(nil) == -1 and T.getref(-1) == nil) +T.unref(-1); T.unref(-1) + +for i=1,Lim do -- unlock all them + T.unref(Arr[i]) +end + +function printlocks () + local f = T.makeCfunc("gettable R; return 1") + local n = f("n") + print("n", n) + for i=0,n do + print(i, f(i)) + end +end + + +for i=1,Lim do -- lock many objects + Arr[i] = T.ref({}) +end + +for i=1,Lim,2 do -- unlock half of them + T.unref(Arr[i]) +end + +assert(type(T.getref(Arr[2])) == 'table') + + +assert(T.getref(-1) == nil) + + +a = T.ref({}) + +collectgarbage() + +assert(type(T.getref(a)) == 'table') + + +-- colect in cl the `val' of all collected userdata +tt = {} +cl = {n=0} +A = nil; B = nil +local F +F = function (x) + local udval = T.udataval(x) + table.insert(cl, udval) + local d = T.newuserdata(100) -- cria lixo + d = nil + assert(debug.getmetatable(x).__gc == F) + assert(load("table.insert({}, {})"))() -- cria mais lixo + collectgarbage() -- forca coleta de lixo durante coleta! + assert(debug.getmetatable(x).__gc == F) -- coleta anterior nao melou isso? + local dummy = {} -- cria lixo durante coleta + if A ~= nil then + assert(type(A) == "userdata") + assert(T.udataval(A) == B) + debug.getmetatable(A) -- just acess it + end + A = x -- ressucita userdata + B = udval + return 1,2,3 +end +tt.__gc = F + +-- test whether udate collection frees memory in the right time +do + collectgarbage(); + collectgarbage(); + local x = collectgarbage("count"); + local a = T.newuserdata(5001) + assert(T.testC("objsize 2; return 1", a) == 5001) + assert(collectgarbage("count") >= x+4) + a = nil + collectgarbage(); + assert(collectgarbage("count") <= x+1) + -- udata without finalizer + x = collectgarbage("count") + collectgarbage("stop") + for i=1,1000 do T.newuserdata(0) end + assert(collectgarbage("count") > x+10) + collectgarbage() + assert(collectgarbage("count") <= x+1) + -- udata with finalizer + x = collectgarbage("count") + collectgarbage() + collectgarbage("stop") + a = {__gc = function () end} + for i=1,1000 do debug.setmetatable(T.newuserdata(0), a) end + assert(collectgarbage("count") >= x+10) + collectgarbage() -- this collection only calls TM, without freeing memory + assert(collectgarbage("count") >= x+10) + collectgarbage() -- now frees memory + assert(collectgarbage("count") <= x+1) + collectgarbage("restart") +end + + +collectgarbage("stop") + +-- create 3 userdatas with tag `tt' +a = T.newuserdata(0); debug.setmetatable(a, tt); na = T.udataval(a) +b = T.newuserdata(0); debug.setmetatable(b, tt); nb = T.udataval(b) +c = T.newuserdata(0); debug.setmetatable(c, tt); nc = T.udataval(c) + +-- create userdata without meta table +x = T.newuserdata(4) +y = T.newuserdata(0) + +assert(not pcall(io.input, a)) +assert(not pcall(io.input, x)) + +assert(debug.getmetatable(x) == nil and debug.getmetatable(y) == nil) + +d=T.ref(a); +e=T.ref(b); +f=T.ref(c); +t = {T.getref(d), T.getref(e), T.getref(f)} +assert(t[1] == a and t[2] == b and t[3] == c) + +t=nil; a=nil; c=nil; +T.unref(e); T.unref(f) + +collectgarbage() + +-- check that unref objects have been collected +assert(#cl == 1 and cl[1] == nc) + +x = T.getref(d) +assert(type(x) == 'userdata' and debug.getmetatable(x) == tt) +x =nil +tt.b = b -- create cycle +tt=nil -- frees tt for GC +A = nil +b = nil +T.unref(d); +n5 = T.newuserdata(0) +debug.setmetatable(n5, {__gc=F}) +n5 = T.udataval(n5) +collectgarbage() +assert(#cl == 4) +-- check order of collection +assert(cl[2] == n5 and cl[3] == nb and cl[4] == na) + +collectgarbage"restart" + + +a, na = {}, {} +for i=30,1,-1 do + a[i] = T.newuserdata(0) + debug.setmetatable(a[i], {__gc=F}) + na[i] = T.udataval(a[i]) +end +cl = {} +a = nil; collectgarbage() +assert(#cl == 30) +for i=1,30 do assert(cl[i] == na[i]) end +na = nil + + +for i=2,Lim,2 do -- unlock the other half + T.unref(Arr[i]) +end + +x = T.newuserdata(41); debug.setmetatable(x, {__gc=F}) +assert(T.testC("objsize 2; return 1", x) == 41) +cl = {} +a = {[x] = 1} +x = T.udataval(x) +collectgarbage() +-- old `x' cannot be collected (`a' still uses it) +assert(#cl == 0) +for n in pairs(a) do a[n] = nil end +collectgarbage() +assert(#cl == 1 and cl[1] == x) -- old `x' must be collected + +-- testing lua_equal +assert(T.testC("compare 2 4 0; return 1", print, 1, print, 20)) +assert(T.testC("compare 3 2 0; return 1", 'alo', "alo")) +assert(T.testC("compare 2 3 0; return 1", nil, nil)) +assert(not T.testC("compare 2 3 0; return 1", {}, {})) +assert(not T.testC("compare 2 3 0; return 1")) +assert(not T.testC("compare 2 3 0; return 1", 3)) + +-- testing lua_equal with fallbacks +do + local map = {} + local t = {__eq = function (a,b) return map[a] == map[b] end} + local function f(x) + local u = T.newuserdata(0) + debug.setmetatable(u, t) + map[u] = x + return u + end + assert(f(10) == f(10)) + assert(f(10) ~= f(11)) + assert(T.testC("compare 2 3 0; return 1", f(10), f(10))) + assert(not T.testC("compare 2 3 0; return 1", f(10), f(20))) + t.__eq = nil + assert(f(10) ~= f(10)) +end + +print'+' + + + +-- testing changing hooks during hooks +_G.t = {} +T.sethook([[ + # set a line hook after 3 count hooks + sethook 4 0 ' + getglobal t; + pushvalue -3; append -2 + pushvalue -2; append -2 + ']], "c", 3) +local a = 1 -- counting +a = 1 -- counting +a = 1 -- count hook (set line hook) +a = 1 -- line hook +a = 1 -- line hook +debug.sethook() +t = _G.t +assert(t[1] == "line") +line = t[2] +assert(t[3] == "line" and t[4] == line + 1) +assert(t[5] == "line" and t[6] == line + 2) +assert(t[7] == nil) + + +------------------------------------------------------------------------- +do -- testing errors during GC + local a = {} + for i=1,20 do + a[i] = T.newuserdata(i) -- creates several udata + end + for i=1,20,2 do -- mark half of them to raise errors during GC + debug.setmetatable(a[i], {__gc = function (x) error("error inside gc") end}) + end + for i=2,20,2 do -- mark the other half to count and to create more garbage + debug.setmetatable(a[i], {__gc = function (x) load("A=A+1")() end}) + end + _G.A = 0 + a = 0 + while 1 do + local stat, msg = pcall(collectgarbage) + if stat then + break -- stop when no more errors + else + a = a + 1 + assert(string.find(msg, "__gc")) + end + end + assert(a == 10) -- number of errors + + assert(A == 10) -- number of normal collections +end +------------------------------------------------------------------------- +-- test for userdata vals +do + local a = {}; local lim = 30 + for i=0,lim do a[i] = T.pushuserdata(i) end + for i=0,lim do assert(T.udataval(a[i]) == i) end + for i=0,lim do assert(T.pushuserdata(i) == a[i]) end + for i=0,lim do a[a[i]] = i end + for i=0,lim do a[T.pushuserdata(i)] = i end + assert(type(tostring(a[1])) == "string") +end + + +------------------------------------------------------------------------- +-- testing multiple states +T.closestate(T.newstate()); +L1 = T.newstate() +assert(L1) + +assert(T.doremote(L1, "X='a'; return 'a'") == 'a') + + +assert(#pack(T.doremote(L1, "function f () return 'alo', 3 end; f()")) == 0) + +a, b = T.doremote(L1, "return f()") +assert(a == 'alo' and b == '3') + +T.doremote(L1, "_ERRORMESSAGE = nil") +-- error: `sin' is not defined +a, _, b = T.doremote(L1, "return sin(1)") +assert(a == nil and b == 2) -- 2 == run-time error + +-- error: syntax error +a, b, c = T.doremote(L1, "return a+") +assert(a == nil and c == 3 and type(b) == "string") -- 3 == syntax error + +T.loadlib(L1) +a, b, c = T.doremote(L1, [[ + string = require'string' + a = require'_G'; assert(a == _G and require("_G") == a) + io = require'io'; assert(type(io.read) == "function") + assert(require("io") == io) + a = require'table'; assert(type(a.insert) == "function") + a = require'debug'; assert(type(a.getlocal) == "function") + a = require'math'; assert(type(a.sin) == "function") + return string.sub('okinama', 1, 2) +]]) +assert(a == "ok") + +T.closestate(L1); + + +L1 = T.newstate() +T.loadlib(L1) +T.doremote(L1, "a = {}") +T.testC(L1, [[getglobal "a"; pushstring "x"; pushnum 1; + settable -3]]) +assert(T.doremote(L1, "return a.x") == "1") + +T.closestate(L1) + +L1 = nil + +print('+') + +------------------------------------------------------------------------- +-- testing memory limits +------------------------------------------------------------------------- +assert(not pcall(T.newuserdata, 2^32-4)) +collectgarbage() +T.totalmem(T.totalmem()+5000) -- set low memory limit (+5k) +assert(not pcall(load"local a={}; for i=1,100000 do a[i]=i end")) +T.totalmem(1000000000) -- restore high limit + +-- test memory errors; increase memory limit in small steps, so that +-- we get memory errors in different parts of a given task, up to there +-- is enough memory to complete the task without errors +function testamem (s, f) + collectgarbage(); collectgarbage() + local M = T.totalmem() + local oldM = M + local a,b = nil + while 1 do + M = M+7 -- increase memory limit in small steps + T.totalmem(M) + a, b = pcall(f) + T.totalmem(1000000000) -- restore high limit + if a and b then break end -- stop when no more errors + collectgarbage() + if not a and not -- `real' error? + (string.find(b, "memory") or string.find(b, "overflow")) then + error(b, 0) -- propagate it + end + end + print("\nlimit for " .. s .. ": " .. M-oldM) + return b +end + + +-- testing memory errors when creating a new state + +b = testamem("state creation", T.newstate) +T.closestate(b); -- close new state + + +-- testing threads + +-- get main thread from registry (at index LUA_RIDX_MAINTHREAD == 1) +mt = T.testC("rawgeti R 1; return 1") +assert(type(mt) == "thread" and coroutine.running() == mt) + + + +function expand (n,s) + if n==0 then return "" end + local e = string.rep("=", n) + return string.format("T.doonnewstack([%s[ %s;\n collectgarbage(); %s]%s])\n", + e, s, expand(n-1,s), e) +end + +G=0; collectgarbage(); a =collectgarbage("count") +load(expand(20,"G=G+1"))() +assert(G==20); collectgarbage(); -- assert(gcinfo() <= a+1) + +testamem("thread creation", function () + return T.doonnewstack("x=1") == 0 -- try to create thread +end) + + +-- testing memory x compiler + +testamem("loadstring", function () + return load("x=1") -- try to do load a string +end) + + +local testprog = [[ +local function foo () return end +local t = {"x"} +a = "aaa" +for i = 1, #t do a=a..t[i] end +return true +]] + +-- testing memory x dofile +_G.a = nil +local t =os.tmpname() +local f = assert(io.open(t, "w")) +f:write(testprog) +f:close() +testamem("dofile", function () + local a = loadfile(t) + return a and a() +end) +assert(os.remove(t)) +assert(_G.a == "aaax") + + +-- other generic tests + +testamem("string creation", function () + local a, b = string.gsub("alo alo", "(a)", function (x) return x..'b' end) + return (a == 'ablo ablo') +end) + +testamem("dump/undump", function () + local a = load(testprog) + local b = a and string.dump(a) + a = b and load(b) + return a and a() +end) + +local t = os.tmpname() +testamem("file creation", function () + local f = assert(io.open(t, 'w')) + assert (not io.open"nomenaoexistente") + io.close(f); + return not loadfile'nomenaoexistente' +end) +assert(os.remove(t)) + +testamem("table creation", function () + local a, lim = {}, 10 + for i=1,lim do a[i] = i; a[i..'a'] = {} end + return (type(a[lim..'a']) == 'table' and a[lim] == lim) +end) + +testamem("constructors", function () + local a = {10, 20, 30, 40, 50; a=1, b=2, c=3, d=4, e=5} + return (type(a) == 'table' and a.e == 5) +end) + +local a = 1 +close = nil +testamem("closure creation", function () + function close (b,c) + return function (x) return a+b+c+x end + end + return (close(2,3)(4) == 10) +end) + +testamem("coroutines", function () + local a = coroutine.wrap(function () + coroutine.yield(string.rep("a", 10)) + return {} + end) + assert(string.len(a()) == 10) + return a() +end) + +print'+' + +-- testing some auxlib functions +local function gsub (a, b, c) + a, b = T.testC("gsub 2 3 4; gettop; return 2", a, b, c) + assert(b == 5) + return a +end + +assert(gsub("alo.alo.uhuh.", ".", "//") == "alo//alo//uhuh//") +assert(gsub("alo.alo.uhuh.", "alo", "//") == "//.//.uhuh.") +assert(gsub("", "alo", "//") == "") +assert(gsub("...", ".", "/.") == "/././.") +assert(gsub("...", "...", "") == "") + + +-- testing luaL_newmetatable +local mt_xuxu, res, top = T.testC("newmetatable xuxu; gettop; return 3") +assert(type(mt_xuxu) == "table" and res and top == 3) +local d, res, top = T.testC("newmetatable xuxu; gettop; return 3") +assert(mt_xuxu == d and not res and top == 3) +d, res, top = T.testC("newmetatable xuxu1; gettop; return 3") +assert(mt_xuxu ~= d and res and top == 3) + +x = T.newuserdata(0); +y = T.newuserdata(0); +T.testC("pushstring xuxu; gettable R; setmetatable 2", x) +assert(getmetatable(x) == mt_xuxu) + +-- testing luaL_testudata +-- correct metatable +local res1, res2, top = T.testC([[testudata -1 xuxu + testudata 2 xuxu + gettop + return 3]], x) +assert(res1 and res2 and top == 4) + +-- wrong metatable +res1, res2, top = T.testC([[testudata -1 xuxu1 + testudata 2 xuxu1 + gettop + return 3]], x) +assert(not res1 and not res2 and top == 4) + +-- non-existent type +res1, res2, top = T.testC([[testudata -1 xuxu2 + testudata 2 xuxu2 + gettop + return 3]], x) +assert(not res1 and not res2 and top == 4) + +-- userdata has no metatable +res1, res2, top = T.testC([[testudata -1 xuxu + testudata 2 xuxu + gettop + return 3]], y) +assert(not res1 and not res2 and top == 4) + +-- erase metatables +do + local r = debug.getregistry() + assert(r.xuxu == mt_xuxu and r.xuxu1 == d) + r.xuxu = nil; r.xuxu1 = nil +end + +print'OK' + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/attrib.lc b/luaj-test/src/test/resources/lua5.2.1-tests/attrib.lc new file mode 100644 index 0000000000000000000000000000000000000000..726086dd0338c9a5602d6a6d1494ae73a6c773ae GIT binary patch literal 21628 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 Z6*L}`QY2rip!ATYU;!$Yiuw)m{{aaNR)7Ei literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/attrib.lua b/luaj-test/src/test/resources/lua5.2.1-tests/attrib.lua new file mode 100644 index 00000000..91c2062f --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/attrib.lua @@ -0,0 +1,420 @@ +-- The tests for 'require' assume some specific directories and libraries; +-- better to avoid them in generic machines + +if not _port then --[ + +print "testing require" + +assert(require"string" == string) +assert(require"math" == math) +assert(require"table" == table) +assert(require"io" == io) +assert(require"os" == os) +assert(require"coroutine" == coroutine) + +assert(type(package.path) == "string") +assert(type(package.cpath) == "string") +assert(type(package.loaded) == "table") +assert(type(package.preload) == "table") + +assert(type(package.config) == "string") +print("package config: "..string.gsub(package.config, "\n", "|")) + +do + -- create a path with 'max' templates, + -- each with 1-10 repetitions of '?' + local max = 2000 + local t = {} + for i = 1,max do t[i] = string.rep("?", i%10 + 1) end + t[#t + 1] = ";" -- empty template + local path = table.concat(t, ";") + -- use that path in a search + local s, err = package.searchpath("xuxu", path) + -- search fails; check that message has an occurence of + -- '??????????' with ? replaced by xuxu and at least 'max' lines + assert(not s and + string.find(err, string.rep("xuxu", 10)) and + #string.gsub(err, "[^\n]", "") >= max) + -- path with one very long template + local path = string.rep("?", max) + local s, err = package.searchpath("xuxu", path) + assert(not s and string.find(err, string.rep('xuxu', max))) +end + +do + local oldpath = package.path + package.path = {} + local s, err = pcall(require, "no-such-file") + assert(not s and string.find(err, "package.path")) + package.path = oldpath +end + +print('+') + +-- auxiliary directory with C modules and temporary files +local DIR = "libs/" + +-- prepend DIR to a name +local function D (x) return DIR .. x end + + +local function createfiles (files, preextras, posextras) + for n,c in pairs(files) do + io.output(D(n)) + io.write(string.format(preextras, n)) + io.write(c) + io.write(string.format(posextras, n)) + io.close(io.output()) + end +end + +function removefiles (files) + for n in pairs(files) do + os.remove(D(n)) + end +end + +local files = { + ["names.lua"] = "do return {...} end\n", + ["err.lua"] = "B = 15; a = a + 1;", + ["A.lua"] = "", + ["B.lua"] = "assert(...=='B');require 'A'", + ["A.lc"] = "", + ["A"] = "", + ["L"] = "", + ["XXxX"] = "", + ["C.lua"] = "package.loaded[...] = 25; require'C'" +} + +AA = nil +local extras = [[ +NAME = '%s' +REQUIRED = ... +return AA]] + +createfiles(files, "", extras) + +-- testing explicit "dir" separator in 'searchpath' +assert(package.searchpath("C.lua", D"?", "", "") == D"C.lua") +assert(package.searchpath("C.lua", D"?", ".", ".") == D"C.lua") +assert(package.searchpath("--x-", D"?", "-", "X") == D"XXxX") +assert(package.searchpath("---xX", D"?", "---", "XX") == D"XXxX") +assert(package.searchpath(D"C.lua", "?", "/") == D"C.lua") +assert(package.searchpath(".\\C.lua", D"?", "\\") == D"./C.lua") + +local oldpath = package.path + +package.path = string.gsub("D/?.lua;D/?.lc;D/?;D/??x?;D/L", "D/", DIR) + +local try = function (p, n, r) + NAME = nil + local rr = require(p) + assert(NAME == n) + assert(REQUIRED == p) + assert(rr == r) +end + +a = require"names" +assert(a[1] == "names" and a[2] == D"names.lua") + +_G.a = nil +assert(not pcall(require, "err")) +assert(B == 15) + +assert(package.searchpath("C", package.path) == D"C.lua") +assert(require"C" == 25) +assert(require"C" == 25) +AA = nil +try('B', 'B.lua', true) +assert(package.loaded.B) +assert(require"B" == true) +assert(package.loaded.A) +assert(require"C" == 25) +package.loaded.A = nil +try('B', nil, true) -- should not reload package +try('A', 'A.lua', true) +package.loaded.A = nil +os.remove(D'A.lua') +AA = {} +try('A', 'A.lc', AA) -- now must find second option +assert(package.searchpath("A", package.path) == D"A.lc") +assert(require("A") == AA) +AA = false +try('K', 'L', false) -- default option +try('K', 'L', false) -- default option (should reload it) +assert(rawget(_G, "_REQUIREDNAME") == nil) + +AA = "x" +try("X", "XXxX", AA) + + +removefiles(files) + + +-- testing require of sub-packages + +local _G = _G + +package.path = string.gsub("D/?.lua;D/?/init.lua", "D/", DIR) + +files = { + ["P1/init.lua"] = "AA = 10", + ["P1/xuxu.lua"] = "AA = 20", +} + +createfiles(files, "_ENV = {}\n", "\nreturn _ENV\n") +AA = 0 + +local m = assert(require"P1") +assert(AA == 0 and m.AA == 10) +assert(require"P1" == m) +assert(require"P1" == m) + +assert(package.searchpath("P1.xuxu", package.path) == D"P1/xuxu.lua") +m.xuxu = assert(require"P1.xuxu") +assert(AA == 0 and m.xuxu.AA == 20) +assert(require"P1.xuxu" == m.xuxu) +assert(require"P1.xuxu" == m.xuxu) +assert(require"P1" == m and m.AA == 10) + + +removefiles(files) + + +package.path = "" +assert(not pcall(require, "file_does_not_exist")) +package.path = "??\0?" +assert(not pcall(require, "file_does_not_exist1")) + +package.path = oldpath + +-- check 'require' error message +local fname = "file_does_not_exist2" +local m, err = pcall(require, fname) +for t in string.gmatch(package.path..";"..package.cpath, "[^;]+") do + t = string.gsub(t, "?", fname) + assert(string.find(err, t, 1, true)) +end + + +local function import(...) + local f = {...} + return function (m) + for i=1, #f do m[f[i]] = _G[f[i]] end + end +end + +-- cannot change environment of a C function +assert(not pcall(module, 'XUXU')) + + + +-- testing require of C libraries + + +local p = "" -- On Mac OS X, redefine this to "_" + +-- check whether loadlib works in this system +local st, err, when = package.loadlib(D"lib1.so", "*") +if not st then + local f, err, when = package.loadlib("donotexist", p.."xuxu") + assert(not f and type(err) == "string" and when == "absent") + ;(Message or print)('\a\n >>> cannot load dynamic library <<<\n\a') + print(err, when) +else + -- tests for loadlib + local f = assert(package.loadlib(D"lib1.so", p.."onefunction")) + local a, b = f(15, 25) + assert(a == 25 and b == 15) + + f = assert(package.loadlib(D"lib1.so", p.."anotherfunc")) + assert(f(10, 20) == "1020\n") + + -- check error messages + local f, err, when = package.loadlib(D"lib1.so", p.."xuxu") + assert(not f and type(err) == "string" and when == "init") + f, err, when = package.loadlib("donotexist", p.."xuxu") + assert(not f and type(err) == "string" and when == "open") + + -- symbols from 'lib1' must be visible to other libraries + f = assert(package.loadlib(D"lib11.so", p.."luaopen_lib11")) + assert(f() == "exported") + + -- test C modules with prefixes in names + package.cpath = D"?.so" + local lib2 = require"v-lib2" + -- check correct access to global environment and correct + -- parameters + assert(_ENV.x == "v-lib2" and _ENV.y == D"v-lib2.so") + assert(lib2.id("x") == "x") + + -- test C submodules + local fs = require"lib1.sub" + assert(_ENV.x == "lib1.sub" and _ENV.y == D"lib1.so") + assert(fs.id(45) == 45) +end + +_ENV = _G + + +-- testing preload + +do + local p = package + package = {} + p.preload.pl = function (...) + local _ENV = {...} + function xuxu (x) return x+20 end + return _ENV + end + + local pl = require"pl" + assert(require"pl" == pl) + assert(pl.xuxu(10) == 30) + assert(pl[1] == "pl" and pl[2] == nil) + + package = p + assert(type(package.path) == "string") +end + +print('+') + +end --] + +print("testing assignments, logical operators, and constructors") + +local res, res2 = 27 + +a, b = 1, 2+3 +assert(a==1 and b==5) +a={} +function f() return 10, 11, 12 end +a.x, b, a[1] = 1, 2, f() +assert(a.x==1 and b==2 and a[1]==10) +a[f()], b, a[f()+3] = f(), a, 'x' +assert(a[10] == 10 and b == a and a[13] == 'x') + +do + local f = function (n) local x = {}; for i=1,n do x[i]=i end; + return table.unpack(x) end; + local a,b,c + a,b = 0, f(1) + assert(a == 0 and b == 1) + A,b = 0, f(1) + assert(A == 0 and b == 1) + a,b,c = 0,5,f(4) + assert(a==0 and b==5 and c==1) + a,b,c = 0,5,f(0) + assert(a==0 and b==5 and c==nil) +end + +a, b, c, d = 1 and nil, 1 or nil, (1 and (nil or 1)), 6 +assert(not a and b and c and d==6) + +d = 20 +a, b, c, d = f() +assert(a==10 and b==11 and c==12 and d==nil) +a,b = f(), 1, 2, 3, f() +assert(a==10 and b==1) + +assert(ab == true) +assert((10 and 2) == 2) +assert((10 or 2) == 10) +assert((10 or assert(nil)) == 10) +assert(not (nil and assert(nil))) +assert((nil or "alo") == "alo") +assert((nil and 10) == nil) +assert((false and 10) == false) +assert((true or 10) == true) +assert((false or 10) == 10) +assert(false ~= nil) +assert(nil ~= false) +assert(not nil == true) +assert(not not nil == false) +assert(not not 1 == true) +assert(not not a == true) +assert(not not (6 or nil) == true) +assert(not not (nil and 56) == false) +assert(not not (nil and true) == false) + +assert({} ~= {}) +print('+') + +a = {} +a[true] = 20 +a[false] = 10 +assert(a[1<2] == 20 and a[1>2] == 10) + +function f(a) return a end + +local a = {} +for i=3000,-3000,-1 do a[i] = i; end +a[10e30] = "alo"; a[true] = 10; a[false] = 20 +assert(a[10e30] == 'alo' and a[not 1] == 20 and a[10<20] == 10) +for i=3000,-3000,-1 do assert(a[i] == i); end +a[print] = assert +a[f] = print +a[a] = a +assert(a[a][a][a][a][print] == assert) +a[print](a[a[f]] == a[print]) +assert(not pcall(function () a[nil] = 10 end)) +assert(a[nil] == nil) +a = nil + +a = {10,9,8,7,6,5,4,3,2; [-3]='a', [f]=print, a='a', b='ab'} +a, a.x, a.y = a, a[-3] +assert(a[1]==10 and a[-3]==a.a and a[f]==print and a.x=='a' and not a.y) +a[1], f(a)[2], b, c = {['alo']=assert}, 10, a[1], a[f], 6, 10, 23, f(a), 2 +a[1].alo(a[2]==10 and b==10 and c==print) + +a[2^31] = 10; a[2^31+1] = 11; a[-2^31] = 12; +a[2^32] = 13; a[-2^32] = 14; a[2^32+1] = 15; a[10^33] = 16; + +assert(a[2^31] == 10 and a[2^31+1] == 11 and a[-2^31] == 12 and + a[2^32] == 13 and a[-2^32] == 14 and a[2^32+1] == 15 and + a[10^33] == 16) + +a = nil + + +-- test conflicts in multiple assignment +do + local a,i,j,b + a = {'a', 'b'}; i=1; j=2; b=a + i, a[i], a, j, a[j], a[i+j] = j, i, i, b, j, i + assert(i == 2 and b[1] == 1 and a == 1 and j == b and b[2] == 2 and + b[3] == 1) +end + +-- repeat test with upvalues +do + local a,i,j,b + a = {'a', 'b'}; i=1; j=2; b=a + local function foo () + i, a[i], a, j, a[j], a[i+j] = j, i, i, b, j, i + end + foo() + assert(i == 2 and b[1] == 1 and a == 1 and j == b and b[2] == 2 and + b[3] == 1) + local t = {} + (function (a) t[a], a = 10, 20 end)(1); + assert(t[1] == 10) +end + +-- bug in 5.2 beta +local function foo () + local a + return function () + local b + a, b = 3, 14 -- local and upvalue have same index + return a, b + end +end + +local a, b = foo()() +assert(a == 3 and b == 14) + +print('OK') + +return res + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/big.lc b/luaj-test/src/test/resources/lua5.2.1-tests/big.lc new file mode 100644 index 0000000000000000000000000000000000000000..6e1829ffe38539b338f2afa7686695d6ba33f5ac GIT binary patch literal 4152 zcmbtXNpBoQ6n@p+Ug9_;B7h;m%CMLufJ`6)1R>DvW$Yx72oA_7vPNyYJsD*@ZF<^S zKq%ESku6NZ1qmc13l4DPKg`(9SaKF|2^VCEMdBQB;skuJyK8#9l7x~zSM}T9t5-GU zy>Cz1?~yQCjaGW>iyduy+DHwt`!6h;$)vrQJ4}+oB-%$Lnx#org{afSnk=$RL7kF> zB?Wy(lByL!-I_JmrJzA}LDVX}v_y-r4F8rvD^kLv6xStU5Bg}C#HY8E?e=em(I^Bn9`Kj#}xOq!rY;20Mf*t-yAdCc+xl ztYe^&Hc&c7D^)4d^L_MlZ0pMWpdl8v(Ohh+3|nQ`8tx&{hq+ajX0g3ST0{M{Wh3Zm z3wi0%aXJmz4r-U_l1agQM7Olo3gA2(b9|@h=L*?W-uALi z%C|@IPLXhhM8k7FoXUAlqCMt}Ol3)D?zcO4SqL#2d3V&#r!J+oG}SeBFcBViy$Rb_7E#k}v6kofQ(hr; zC3!~7im*7akD*C8FHu;VsAfqX^opx#t{jJnx=YyL`s1mjQc!CP`t`$>o*M9m_Cc ztDe(PDwG9>HXKn;+Gw}#?(QS0xMQf^l-=D_Z>M?;b?&JX#GAptm<%mC6w_qVjA@Fh zB$_ixOjr1u#5WWjLXK&pechx~XhPKxnE|N6O88fGxjB-{cIT&T;@(oBY&LU?s5bFK zGpwa3g*t^@aB4g<{U_h2$FX4GLgPbPBa@cQiVy+O3UaGeOj?!_4+cs1m>(MV?($>5 zDvXV0wxTkLa$^leiE?YCoCBALDeJO52qFXO%;T&Y$GXz9P$VCTJ&TEPFZz*us6;Pd zVnCm($JHc1jh4n^w5cIX!4ccblpFhSU_X)mZHp3q9 z6x3N&Jlwi0`|>VaO@GjCCVk#kaz1SSuXC`i%|nCTN?%1aB>RL1Xm&2b5eIa*a5K?|Z>J zkXJZ`wF38SGr%Ky%khcjlh3yYk9=+-Jf%!ix5lLBX2T=ML_Wei4&ZH;3STt`!=uNh zSMgve=O;XN#3R%z`p#s+;#-DCE};as?9>{v;S)9d(R3f}}gLX%mi;CQz0 zdI!VI-vxbDI7K|voP@_W4v$b5k44{e^9fh^I!h-Z!_`w1hrY&FV>}b H{PF)6E*mXn literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/big.lua b/luaj-test/src/test/resources/lua5.2.1-tests/big.lua new file mode 100644 index 00000000..0c8ab201 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/big.lua @@ -0,0 +1,79 @@ +if _soft then + return 'a' +end + +print "testing large tables" + +local debug = require"debug" + +local lim = 2^18 + 1000 +local prog = { "local y = {0" } +for i = 1, lim do prog[#prog + 1] = i end +prog[#prog + 1] = "}\n" +prog[#prog + 1] = "X = y\n" +prog[#prog + 1] = ("assert(X[%d] == %d)"):format(lim - 1, lim - 2) +prog[#prog + 1] = "return 0" +prog = table.concat(prog, ";") + +local env = {string = string, assert = assert} +local f = assert(load(prog, nil, nil, env)) + +f() +assert(env.X[lim] == lim - 1 and env.X[lim + 1] == lim) +for k in pairs(env) do env[k] = nil end + +-- yields during accesses larger than K (in RK) +setmetatable(env, { + __index = function (t, n) coroutine.yield('g'); return _G[n] end, + __newindex = function (t, n, v) coroutine.yield('s'); _G[n] = v end, +}) + +X = nil +co = coroutine.wrap(f) +assert(co() == 's') +assert(co() == 'g') +assert(co() == 'g') +assert(co() == 0) + +assert(X[lim] == lim - 1 and X[lim + 1] == lim) + +-- errors in accesses larger than K (in RK) +getmetatable(env).__index = function () end +getmetatable(env).__newindex = function () end +local e, m = pcall(f) +assert(not e and m:find("global 'X'")) + +-- errors in metamethods +getmetatable(env).__newindex = function () error("hi") end +local e, m = xpcall(f, debug.traceback) +assert(not e and m:find("'__newindex'")) + +f, X = nil + +coroutine.yield'b' + +if not _no32 then -- { + +print "testing string length overflow" + +local repstrings = 192 -- number of strings to be concatenated +local ssize = math.ceil(2^32 / repstrings) + 1 -- size of each string + +assert(repstrings * ssize > 2^32) -- this should be larger than maximum size_t + +local longs = string.rep("\0", ssize) -- create one long string + +-- create function to concatentate 'repstrings' copies of its argument +local rep = assert(load( + "local a = ...; return " .. string.rep("a", repstrings, ".."))) + +local a, b = pcall(rep, longs) -- call that function + +-- it should fail without creating string (result would be too large) +assert(not a and string.find(b, "overflow")) + +end -- } + +print'OK' + +return 'a' diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lc b/luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lc new file mode 100644 index 0000000000000000000000000000000000000000..d04721a53a21ddebf70d80ff520e3c3294ef77ee GIT binary patch literal 9269 zcmcJTU2Ggz701t=U9Ue4)h80U83Kq^YPNkUQ&i)6cjyjaeaCVeM>^6`Nga zcPqkE?%2YSkop9#Mzl{n)0e(fommSTIh6pZsC@|}6y6Zc0|-zb!vEZvJG)NTGj|g@ z(m%N~=XcIM_uP*e@53*=TAn459m$T+gFhP|duWWzB_?iWh;k&!l|)mLL{3R6`jSpj zK=Vq`D%w}2D*`2GO_3HI7?KjPBHOG9CPX`D3NZ<6!# zBaSw9=Hv$IEGW>mPMMRK&85#DvwjX$8V*^xxpNL`Gh}@WHjX5!+rU2C6hVd@i49TKPq;a$9Q zo^D6it)E{Gv4#t7)?F4fwT!wZjW>#uTK|YMHBGEZ4{K_Y$a~>fQgev7IESSAL@d|f zI-lQ3>&5M^!2>CrsV(O)W#%cxhr)FvCJNq9lILPW&#CK-rRVHz+OzIfCd~V}Ea&ZY zhOsV`aGhb@kG46kwyk#X?kl)ML1%*2Fg~oG0W@vbQCO131ygD{~(v>GqHK&LXVa!AZu{>`t`d0nt&&0x*JeT{tgX4MgXTy0D_aiTGdhQh7E#K`wmR=u^ zeUO9B6+SA(2k&Kpxo~wZ`!8i}aDgV2l7XJ}33Z*tnp;=j~l^5fsuupscV*hKQ)45;$U5}g7dz?-Aa3MwG zqM7H}LU<`cxGN?x3V=FF_jV8d^ zXg4?;O@g!09&k3=3(iLOgR{{-a5mZx&PMpC;6J#nbO4;K9t3Nvhrrs3Uskqy1gx#5 zz}o6FU~Tm%*k0vve=p)#pC3R6!P@EzU~Tn9u(tXVSX(^?)>enW+Um<-ZFLx|t-b=* zR$m2ct0Q1-^);}zdK|2+z7Ez_N5R_a39z<$60FfT&`#4+V2r+rcCWsLdm9}GXRB|6 zy<2?;zJurl_N)t> zia$tg^#WL1y$JTx(rLv0v^0a*y?P1v_bQHO&YxG%PSP3JlQai=lD-Ffno3~O^nEZ! zXVD%+KL9_7%HRjl0{B6+2!0Tq13!q)gHO{1Flo97#zs|eHu@pBK~;m#pt=N~K~x7n zh#KGr(GvJU)q+p2CUAcr#Mfiz8_j&Rey(!)5d8=DW8w~5t$L~2?%H-~ugI^}t}Jy; zPGqXmf6*F6AoFCA-oqXL`9Im~exXw5U*8(dL-aoE{|3G-trq_<)wOZjeCd=I8})Xx zQR`YwUuWq9#QGO*&69=r$+qaxp#K7l>20=X(8kth(8gpssnUmN{u4s)`qu|e_3YE9 G=jeZjF{H)- literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lua b/luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lua new file mode 100644 index 00000000..afa158dd --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lua @@ -0,0 +1,115 @@ +print("testing bitwise operations") + +assert(bit32.band() == bit32.bnot(0)) +assert(bit32.btest() == true) +assert(bit32.bor() == 0) +assert(bit32.bxor() == 0) + +assert(bit32.band() == bit32.band(0xffffffff)) +assert(bit32.band(1,2) == 0) + + +-- out-of-range numbers +assert(bit32.band(-1) == 0xffffffff) +assert(bit32.band(2^33 - 1) == 0xffffffff) +assert(bit32.band(-2^33 - 1) == 0xffffffff) +assert(bit32.band(2^33 + 1) == 1) +assert(bit32.band(-2^33 + 1) == 1) +assert(bit32.band(-2^40) == 0) +assert(bit32.band(2^40) == 0) +assert(bit32.band(-2^40 - 2) == 0xfffffffe) +assert(bit32.band(2^40 - 4) == 0xfffffffc) + +assert(bit32.lrotate(0, -1) == 0) +assert(bit32.lrotate(0, 7) == 0) +assert(bit32.lrotate(0x12345678, 4) == 0x23456781) +assert(bit32.rrotate(0x12345678, -4) == 0x23456781) +assert(bit32.lrotate(0x12345678, -8) == 0x78123456) +assert(bit32.rrotate(0x12345678, 8) == 0x78123456) +assert(bit32.lrotate(0xaaaaaaaa, 2) == 0xaaaaaaaa) +assert(bit32.lrotate(0xaaaaaaaa, -2) == 0xaaaaaaaa) +for i = -50, 50 do + assert(bit32.lrotate(0x89abcdef, i) == bit32.lrotate(0x89abcdef, i%32)) +end + +assert(bit32.lshift(0x12345678, 4) == 0x23456780) +assert(bit32.lshift(0x12345678, 8) == 0x34567800) +assert(bit32.lshift(0x12345678, -4) == 0x01234567) +assert(bit32.lshift(0x12345678, -8) == 0x00123456) +assert(bit32.lshift(0x12345678, 32) == 0) +assert(bit32.lshift(0x12345678, -32) == 0) +assert(bit32.rshift(0x12345678, 4) == 0x01234567) +assert(bit32.rshift(0x12345678, 8) == 0x00123456) +assert(bit32.rshift(0x12345678, 32) == 0) +assert(bit32.rshift(0x12345678, -32) == 0) +assert(bit32.arshift(0x12345678, 0) == 0x12345678) +assert(bit32.arshift(0x12345678, 1) == 0x12345678 / 2) +assert(bit32.arshift(0x12345678, -1) == 0x12345678 * 2) +assert(bit32.arshift(-1, 1) == 0xffffffff) +assert(bit32.arshift(-1, 24) == 0xffffffff) +assert(bit32.arshift(-1, 32) == 0xffffffff) +assert(bit32.arshift(-1, -1) == (-1 * 2) % 2^32) + +print("+") +-- some special cases +local c = {0, 1, 2, 3, 10, 0x80000000, 0xaaaaaaaa, 0x55555555, + 0xffffffff, 0x7fffffff} + +for _, b in pairs(c) do + assert(bit32.band(b) == b) + assert(bit32.band(b, b) == b) + assert(bit32.btest(b, b) == (b ~= 0)) + assert(bit32.band(b, b, b) == b) + assert(bit32.btest(b, b, b) == (b ~= 0)) + assert(bit32.band(b, bit32.bnot(b)) == 0) + assert(bit32.bor(b, bit32.bnot(b)) == bit32.bnot(0)) + assert(bit32.bor(b) == b) + assert(bit32.bor(b, b) == b) + assert(bit32.bor(b, b, b) == b) + assert(bit32.bxor(b) == b) + assert(bit32.bxor(b, b) == 0) + assert(bit32.bxor(b, 0) == b) + assert(bit32.bnot(b) ~= b) + assert(bit32.bnot(bit32.bnot(b)) == b) + assert(bit32.bnot(b) == 2^32 - 1 - b) + assert(bit32.lrotate(b, 32) == b) + assert(bit32.rrotate(b, 32) == b) + assert(bit32.lshift(bit32.lshift(b, -4), 4) == bit32.band(b, bit32.bnot(0xf))) + assert(bit32.rshift(bit32.rshift(b, 4), -4) == bit32.band(b, bit32.bnot(0xf))) + for i = -40, 40 do + assert(bit32.lshift(b, i) == math.floor((b * 2^i) % 2^32)) + end +end + +assert(not pcall(bit32.band, {})) +assert(not pcall(bit32.bnot, "a")) +assert(not pcall(bit32.lshift, 45)) +assert(not pcall(bit32.lshift, 45, print)) +assert(not pcall(bit32.rshift, 45, print)) + +print("+") + + +-- testing extract/replace + +assert(bit32.extract(0x12345678, 0, 4) == 8) +assert(bit32.extract(0x12345678, 4, 4) == 7) +assert(bit32.extract(0xa0001111, 28, 4) == 0xa) +assert(bit32.extract(0xa0001111, 31, 1) == 1) +assert(bit32.extract(0x50000111, 31, 1) == 0) +assert(bit32.extract(0xf2345679, 0, 32) == 0xf2345679) + +assert(not pcall(bit32.extract, 0, -1)) +assert(not pcall(bit32.extract, 0, 32)) +assert(not pcall(bit32.extract, 0, 0, 33)) +assert(not pcall(bit32.extract, 0, 31, 2)) + +assert(bit32.replace(0x12345678, 5, 28, 4) == 0x52345678) +assert(bit32.replace(0x12345678, 0x87654321, 0, 32) == 0x87654321) +assert(bit32.replace(0, 1, 2) == 2^2) +assert(bit32.replace(0, -1, 4) == 2^4) +assert(bit32.replace(-1, 0, 31) == 2^31 - 1) +assert(bit32.replace(-1, 0, 1, 2) == 2^32 - 7) + + +print'OK' diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/calls.lc b/luaj-test/src/test/resources/lua5.2.1-tests/calls.lc new file mode 100644 index 0000000000000000000000000000000000000000..66a70f3afaf997a82d78959e503d57a7d6560e56 GIT binary patch literal 17571 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 SC=XRpdSePqkKMEHTK^w?X>Bn8 literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/calls.lua b/luaj-test/src/test/resources/lua5.2.1-tests/calls.lua new file mode 100644 index 00000000..5750ab57 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/calls.lua @@ -0,0 +1,305 @@ +print("testing functions and calls") + +local debug = require "debug" + +-- get the opportunity to test 'type' too ;) + +assert(type(1<2) == 'boolean') +assert(type(true) == 'boolean' and type(false) == 'boolean') +assert(type(nil) == 'nil' and type(-3) == 'number' and type'x' == 'string' and + type{} == 'table' and type(type) == 'function') + +assert(type(assert) == type(print)) +f = nil +function f (x) return a:x (x) end +assert(type(f) == 'function') + + +-- testing local-function recursion +fact = false +do + local res = 1 + local function fact (n) + if n==0 then return res + else return n*fact(n-1) + end + end + assert(fact(5) == 120) +end +assert(fact == false) + +-- testing declarations +a = {i = 10} +self = 20 +function a:x (x) return x+self.i end +function a.y (x) return x+self end + +assert(a:x(1)+10 == a.y(1)) + +a.t = {i=-100} +a["t"].x = function (self, a,b) return self.i+a+b end + +assert(a.t:x(2,3) == -95) + +do + local a = {x=0} + function a:add (x) self.x, a.y = self.x+x, 20; return self end + assert(a:add(10):add(20):add(30).x == 60 and a.y == 20) +end + +local a = {b={c={}}} + +function a.b.c.f1 (x) return x+1 end +function a.b.c:f2 (x,y) self[x] = y end +assert(a.b.c.f1(4) == 5) +a.b.c:f2('k', 12); assert(a.b.c.k == 12) + +print('+') + +t = nil -- 'declare' t +function f(a,b,c) local d = 'a'; t={a,b,c,d} end + +f( -- this line change must be valid + 1,2) +assert(t[1] == 1 and t[2] == 2 and t[3] == nil and t[4] == 'a') +f(1,2, -- this one too + 3,4) +assert(t[1] == 1 and t[2] == 2 and t[3] == 3 and t[4] == 'a') + +function fat(x) + if x <= 1 then return 1 + else return x*load("return fat(" .. x-1 .. ")")() + end +end + +assert(load "load 'assert(fat(6)==720)' () ")() +a = load('return fat(5), 3') +a,b = a() +assert(a == 120 and b == 3) +print('+') + +function err_on_n (n) + if n==0 then error(); exit(1); + else err_on_n (n-1); exit(1); + end +end + +do + function dummy (n) + if n > 0 then + assert(not pcall(err_on_n, n)) + dummy(n-1) + end + end +end + +dummy(10) + +function deep (n) + if n>0 then deep(n-1) end +end +deep(10) +deep(200) + +-- testing tail call +function deep (n) if n>0 then return deep(n-1) else return 101 end end +assert(deep(30000) == 101) +a = {} +function a:deep (n) if n>0 then return self:deep(n-1) else return 101 end end +assert(a:deep(30000) == 101) + +print('+') + + +a = nil +(function (x) a=x end)(23) +assert(a == 23 and (function (x) return x*2 end)(20) == 40) + + +-- testing closures + +-- fixed-point operator +Z = function (le) + local function a (f) + return le(function (x) return f(f)(x) end) + end + return a(a) + end + + +-- non-recursive factorial + +F = function (f) + return function (n) + if n == 0 then return 1 + else return n*f(n-1) end + end + end + +fat = Z(F) + +assert(fat(0) == 1 and fat(4) == 24 and Z(F)(5)==5*Z(F)(4)) + +local function g (z) + local function f (a,b,c,d) + return function (x,y) return a+b+c+d+a+x+y+z end + end + return f(z,z+1,z+2,z+3) +end + +f = g(10) +assert(f(9, 16) == 10+11+12+13+10+9+16+10) + +Z, F, f = nil +print('+') + +-- testing multiple returns + +function unlpack (t, i) + i = i or 1 + if (i <= #t) then + return t[i], unlpack(t, i+1) + end +end + +function equaltab (t1, t2) + assert(#t1 == #t2) + for i = 1, #t1 do + assert(t1[i] == t2[i]) + end +end + +local pack = function (...) return (table.pack(...)) end + +function f() return 1,2,30,4 end +function ret2 (a,b) return a,b end + +local a,b,c,d = unlpack{1,2,3} +assert(a==1 and b==2 and c==3 and d==nil) +a = {1,2,3,4,false,10,'alo',false,assert} +equaltab(pack(unlpack(a)), a) +equaltab(pack(unlpack(a), -1), {1,-1}) +a,b,c,d = ret2(f()), ret2(f()) +assert(a==1 and b==1 and c==2 and d==nil) +a,b,c,d = unlpack(pack(ret2(f()), ret2(f()))) +assert(a==1 and b==1 and c==2 and d==nil) +a,b,c,d = unlpack(pack(ret2(f()), (ret2(f())))) +assert(a==1 and b==1 and c==nil and d==nil) + +a = ret2{ unlpack{1,2,3}, unlpack{3,2,1}, unlpack{"a", "b"}} +assert(a[1] == 1 and a[2] == 3 and a[3] == "a" and a[4] == "b") + + +-- testing calls with 'incorrect' arguments +rawget({}, "x", 1) +rawset({}, "x", 1, 2) +assert(math.sin(1,2) == math.sin(1)) +table.sort({10,9,8,4,19,23,0,0}, function (a,b) return a_Kge-9Jg;+RFh#d-j z$=VU&sV!2U`CoiSDiT%yf~wDb<*6^FQh&2|Yo9Mp3M2i_H#564v$r#|>q8gTs$Y|E zCY%X6@XPMZ!3-G^P8P2&Nh(Q6n@Up9BdRDR<|!cPR8bNYNzt?<;YyFD$fK+xmB+jZ zQk}!lL4d4jR#Y;)$&){Lw>dT{dFI_9jfU{nVeMg-fCCdm}*7r zH{?u4uh$m+Yd6}}?;8Hl($aFPy;>y)L)buQ#A22g=Sk8F;9%LH$iNZ6Z*L?8YhP#%r@3W-45Lo@vJZuqAQ=yeM|i1X8=L_ zZsMne*vhhpsPNHAh)GQFIz&GOQUn3Mmp7$K7RD5MjzZwS7s#nt9Wh0LlkHi`EqYY8 zEepJxg&Ay4Dl180^HO^Air73Gn^z=}RWGS2g?UQodGkD$u)*;$a(`&EXwkgtx=Foj zOG-cVTxlyuVbi8Jlwkjt@t*AoRYE-Xz|WJN=D8cNy#fCf?SB$+SuV$y5jNt;s4t;| z9k*6gl<{o$53DguyR@Byy{_P~mz2_R#%+}!CVYY)>k~0##73%Q7pPq9yZ3C{>e(t) zDJoIITFS+q%j?iGyCd*P)A-J5iBHRGQCO#ro&H|GD*jr}cyu?@QFk)|Z5|dRIG=W7 z@8Vgy3p|raC4&8sqL(M($|||Ihky(w(38i zCJeh6vc~_yf_5SFbGuCDtmHb2;|1`%$~g9bPhu}*47U9|*pKmy7k9wR&~1lTpi6=) z+5nlzt!!INLB}`{;She~cnv&b`hV~`^v{FC7@tHAvYl`Q`Z#z`-i+ZW-nqfBoI4#8 z+9-&3)?`MMC<$qlFOf8sHrz&ex-r<$O^qd-8cZ__%d5FMa`*NzJ_)D+jOZHmrFwg) zGp$_DYqkBAp~^U^6Iap=fZa3Q@bBoHi_30R8v~i?v`znZdmuE+SX!Y|Yy;p5Fk^LB zJ`TZ$TCwLeev)0;?MRXWoeCA-6G}{bXk(Ch0dm4a+ZKZ6z;rx8M})0h3th4x9f_qV zOWD(XB{sW~e(iens2`++ZIQH<{bv^z(P17Gl*oBc*SFgAgti%=V`DzLlD!Gr_X;xA zgYDf#Wk0YGPk|`c`8S;JSvn@}Onlhv*qH{MB02`sn80*G)0oCJILL9>)|=OdeGJ>b zgyVXkznrgCawo{)7Qqx+jGkJ;n-I1M{!JdJybW(9@HY4)PC#Zbi}yI*0iVQ4$aVtH zXWs_z;ysS{!0!Ye`#}txRs0RGTbjaBWb0c?F)kgJB1=sUql0rTuxO;XqQc|e%l&6W z7Zsk-O+wEUD?FnzG1hhS=4NLkS9E)gOKuG$BhI2g-oRY`k|Vk(5ThFth*250b;`pC zZ||0h{RqMfTCul)AFf!1--_a)O5gWTp!6GL!Xqk!nG1SWCqVb~98@UoO?^SrT@q8$ z!zCD1Tkt5|^&BJru_whv>QdS2ipy|<6GT0h(qaB$zvn!bmXj0zth<3nC4u{e*S9(y ziypCKOHsKi>8nDQ?spZczCaa$PJmbhVkmj=-w9B=N>n-|!nkae?svqY$QMjfsqfLI zRY1iTQh{Y76O=7&a(*rro%s;}iYU8fSm>JTb;==@snj4We>aF%b$|pY4QuVf$^Etw!N9sT74P5tp=^4>Qy}{_l^ai7{FqNsU4RE(J zlBRA+Tl!z*md}3Pm~n26Zj4)_GEVBc`N|Qu-0xY!8D}a*Un^LEKYDmFB~y@Zq-^$C d;9#5qyI}AJ%>aDL^D%QA;O#W65wBZA`VWu8^v?hQ literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/checktable.lua b/luaj-test/src/test/resources/lua5.2.1-tests/checktable.lua new file mode 100644 index 00000000..4fd1f129 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/checktable.lua @@ -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 == "" then + assert(val==nil) + else + assert(t[key] == val) + local mp = T.hash(key, t) + if l[i] then + assert(l[i] == mp) + elseif mp ~= i then + l[i] = mp + else -- list head + l[mp] = {mp} -- first element + while next do + assert(ff <= next and next < hsize) + if l[next] then assert(l[next] == mp) else l[next] = mp end + table.insert(l[mp], next) + key,val,next = T.querytab(t, next) + assert(key) + end + end + end + end + l.asize = asize; l.hsize = hsize; l.ff = ff + return l +end + +function mostra (t) + local asize, hsize, ff = T.querytab(t) + print(asize, hsize, ff) + print'------' + for i=0,asize-1 do + local _, v = T.querytab(t, i) + print(string.format("[%d] -", i), v) + end + print'------' + for i=0,hsize-1 do + print(i, T.querytab(t, i+asize)) + end + print'-------------' +end + +function stat (t) + t = checktable(t) + local nelem, nlist = 0, 0 + local maxlist = {} + for i=0,t.hsize-1 do + if type(t[i]) == 'table' then + local n = table.getn(t[i]) + nlist = nlist+1 + nelem = nelem + n + if not maxlist[n] then maxlist[n] = 0 end + maxlist[n] = maxlist[n]+1 + end + end + print(string.format("hsize=%d elements=%d load=%.2f med.len=%.2f (asize=%d)", + t.hsize, nelem, nelem/t.hsize, nelem/nlist, t.asize)) + for i=1,table.getn(maxlist) do + local n = maxlist[i] or 0 + print(string.format("%5d %10d %.2f%%", i, n, n*100/nlist)) + end +end + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/closure.lc b/luaj-test/src/test/resources/lua5.2.1-tests/closure.lc new file mode 100644 index 0000000000000000000000000000000000000000..d593f9bd94e18b7262f13c8d1ce051f7a85bbbc1 GIT binary patch literal 13362 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 literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/closure.lua b/luaj-test/src/test/resources/lua5.2.1-tests/closure.lua new file mode 100644 index 00000000..738002d2 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/closure.lua @@ -0,0 +1,244 @@ +print "testing closures" + +local A,B = 0,{g=10} +function f(x) + local a = {} + for i=1,1000 do + local y = 0 + do + a[i] = function () B.g = B.g+1; y = y+x; return y+A end + end + end + local dummy = function () return a[A] end + collectgarbage() + A = 1; assert(dummy() == a[1]); A = 0; + assert(a[1]() == x) + assert(a[3]() == x) + collectgarbage() + assert(B.g == 12) + return a +end + +local a = f(10) +-- force a GC in this level +local x = {[1] = {}} -- to detect a GC +setmetatable(x, {__mode = 'kv'}) +while x[1] do -- repeat until GC + local a = A..A..A..A -- create garbage + A = A+1 +end +assert(a[1]() == 20+A) +assert(a[1]() == 30+A) +assert(a[2]() == 10+A) +collectgarbage() +assert(a[2]() == 20+A) +assert(a[2]() == 30+A) +assert(a[3]() == 20+A) +assert(a[8]() == 10+A) +assert(getmetatable(x).__mode == 'kv') +assert(B.g == 19) + + +-- testing equality +a = {} +for i = 1, 5 do a[i] = function (x) return x + a + _ENV end end +assert(a[3] == a[4] and a[4] == a[5]) + +for i = 1, 5 do a[i] = function (x) return i + a + _ENV end end +assert(a[3] ~= a[4] and a[4] ~= a[5]) + +local function f() + return function (x) return math.sin(_ENV[x]) end +end +assert(f() == f()) + + +-- testing closures with 'for' control variable +a = {} +for i=1,10 do + a[i] = {set = function(x) i=x end, get = function () return i end} + if i == 3 then break end +end +assert(a[4] == nil) +a[1].set(10) +assert(a[2].get() == 2) +a[2].set('a') +assert(a[3].get() == 3) +assert(a[2].get() == 'a') + +a = {} +local t = {"a", "b"} +for i = 1, #t do + local k = t[i] + a[i] = {set = function(x, y) i=x; k=y end, + get = function () return i, k end} + if i == 2 then break end +end +a[1].set(10, 20) +local r,s = a[2].get() +assert(r == 2 and s == 'b') +r,s = a[1].get() +assert(r == 10 and s == 20) +a[2].set('a', 'b') +r,s = a[2].get() +assert(r == "a" and s == "b") + + +-- testing closures with 'for' control variable x break +for i=1,3 do + f = function () return i end + break +end +assert(f() == 1) + +for k = 1, #t do + local v = t[k] + f = function () return k, v end + break +end +assert(({f()})[1] == 1) +assert(({f()})[2] == "a") + + +-- testing closure x break x return x errors + +local b +function f(x) + local first = 1 + while 1 do + if x == 3 and not first then return end + local a = 'xuxu' + b = function (op, y) + if op == 'set' then + a = x+y + else + return a + end + end + if x == 1 then do break end + elseif x == 2 then return + else if x ~= 3 then error() end + end + first = nil + end +end + +for i=1,3 do + f(i) + assert(b('get') == 'xuxu') + b('set', 10); assert(b('get') == 10+i) + b = nil +end + +pcall(f, 4); +assert(b('get') == 'xuxu') +b('set', 10); assert(b('get') == 14) + + +local w +-- testing multi-level closure +function f(x) + return function (y) + return function (z) return w+x+y+z end + end +end + +y = f(10) +w = 1.345 +assert(y(20)(30) == 60+w) + +-- testing closures x repeat-until + +local a = {} +local i = 1 +repeat + local x = i + a[i] = function () i = x+1; return x end +until i > 10 or a[i]() ~= x +assert(i == 11 and a[1]() == 1 and a[3]() == 3 and i == 4) + + +-- testing closures created in 'then' and 'else' parts of 'if's +a = {} +for i = 1, 10 do + if i % 3 == 0 then + local y = 0 + a[i] = function (x) local t = y; y = x; return t end + elseif i % 3 == 1 then + goto L1 + error'not here' + ::L1:: + local y = 1 + a[i] = function (x) local t = y; y = x; return t end + elseif i % 3 == 2 then + local t + goto l4 + ::l4a:: a[i] = t; goto l4b + error("should never be here!") + ::l4:: + local y = 2 + t = function (x) local t = y; y = x; return t end + goto l4a + error("should never be here!") + ::l4b:: + end +end + +for i = 1, 10 do + assert(a[i](i * 10) == i % 3 and a[i]() == i * 10) +end + +print'+' + + +-- test for correctly closing upvalues in tail calls of vararg functions +local function t () + local function c(a,b) assert(a=="test" and b=="OK") end + local function v(f, ...) c("test", f() ~= 1 and "FAILED" or "OK") end + local x = 1 + return v(function() return x end) +end +t() + + +-- test for debug manipulation of upvalues +local debug = require'debug' + +do + local a , b, c = 3, 5, 7 + foo1 = function () return a+b end; + foo2 = function () return b+a end; + do + local a = 10 + foo3 = function () return a+b end; + end +end + +assert(debug.upvalueid(foo1, 1)) +assert(debug.upvalueid(foo1, 2)) +assert(not pcall(debug.upvalueid, foo1, 3)) +assert(debug.upvalueid(foo1, 1) == debug.upvalueid(foo2, 2)) +assert(debug.upvalueid(foo1, 2) == debug.upvalueid(foo2, 1)) +assert(debug.upvalueid(foo3, 1)) +assert(debug.upvalueid(foo1, 1) ~= debug.upvalueid(foo3, 1)) +assert(debug.upvalueid(foo1, 2) == debug.upvalueid(foo3, 2)) + +assert(debug.upvalueid(string.gmatch("x", "x"), 1) ~= nil) + +assert(foo1() == 3 + 5 and foo2() == 5 + 3) +debug.upvaluejoin(foo1, 2, foo2, 2) +assert(foo1() == 3 + 3 and foo2() == 5 + 3) +assert(foo3() == 10 + 5) +debug.upvaluejoin(foo3, 2, foo2, 1) +assert(foo3() == 10 + 5) +debug.upvaluejoin(foo3, 2, foo2, 2) +assert(foo3() == 10 + 3) + +assert(not pcall(debug.upvaluejoin, foo1, 3, foo2, 1)) +assert(not pcall(debug.upvaluejoin, foo1, 1, foo2, 3)) +assert(not pcall(debug.upvaluejoin, foo1, 0, foo2, 1)) +assert(not pcall(debug.upvaluejoin, print, 1, foo2, 1)) +assert(not pcall(debug.upvaluejoin, {}, 1, foo2, 1)) +assert(not pcall(debug.upvaluejoin, foo1, 1, print, 1)) + +print'OK' diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/code.lc b/luaj-test/src/test/resources/lua5.2.1-tests/code.lc new file mode 100644 index 0000000000000000000000000000000000000000..0fcbe9b87fd6dd59858ad7065bd2562148a161a6 GIT binary patch literal 8292 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 literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/code.lua b/luaj-test/src/test/resources/lua5.2.1-tests/code.lua new file mode 100644 index 00000000..a0317c55 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/code.lua @@ -0,0 +1,182 @@ +if T==nil then + (Message or print)('\a\n >>> testC not active: skipping opcode tests <<<\n\a') + return +end +print "testing code generation and optimizations" + + +-- this code gave an error for the code checker +do + local function f (a) + for k,v,w in a do end + end +end + + +function check (f, ...) + local arg = {...} + local c = T.listcode(f) + for i=1, #arg do + -- print(arg[i], c[i]) + assert(string.find(c[i], '- '..arg[i]..' *%d')) + end + assert(c[#arg+2] == nil) +end + + +function checkequal (a, b) + a = T.listcode(a) + b = T.listcode(b) + for i = 1, #a do + a[i] = string.gsub(a[i], '%b()', '') -- remove line number + b[i] = string.gsub(b[i], '%b()', '') -- remove line number + assert(a[i] == b[i]) + end +end + + +-- some basic instructions +check(function () + (function () end){f()} +end, 'CLOSURE', 'NEWTABLE', 'GETTABUP', 'CALL', 'SETLIST', 'CALL', 'RETURN') + + +-- sequence of LOADNILs +check(function () + local a,b,c + local d; local e; + local f,g,h; + d = nil; d=nil; b=nil; a=nil; c=nil; +end, 'LOADNIL', 'RETURN') + +check(function () + local a,b,c,d = 1,1,1,1 + d=nil;c=nil;b=nil;a=nil +end, 'LOADK', 'LOADK', 'LOADK', 'LOADK', 'LOADNIL', 'RETURN') + +do + local a,b,c,d = 1,1,1,1 + d=nil;c=nil;b=nil;a=nil + assert(a == nil and b == nil and c == nil and d == nil) +end + + +-- single return +check (function (a,b,c) return a end, 'RETURN') + + +-- infinite loops +check(function () while true do local a = -1 end end, +'LOADK', 'JMP', 'RETURN') + +check(function () while 1 do local a = -1 end end, +'LOADK', 'JMP', 'RETURN') + +check(function () repeat local x = 1 until true end, +'LOADK', 'RETURN') + + +-- concat optimization +check(function (a,b,c,d) return a..b..c..d end, + 'MOVE', 'MOVE', 'MOVE', 'MOVE', 'CONCAT', 'RETURN') + +-- not +check(function () return not not nil end, 'LOADBOOL', 'RETURN') +check(function () return not not false end, 'LOADBOOL', 'RETURN') +check(function () return not not true end, 'LOADBOOL', 'RETURN') +check(function () return not not 1 end, 'LOADBOOL', 'RETURN') + +-- direct access to locals +check(function () + local a,b,c,d + a = b*2 + c[4], a[b] = -((a + d/-20.5 - a[b]) ^ a.x), b +end, + 'LOADNIL', + 'MUL', + 'DIV', 'ADD', 'GETTABLE', 'SUB', 'GETTABLE', 'POW', + 'UNM', 'SETTABLE', 'SETTABLE', 'RETURN') + + +-- direct access to constants +check(function () + local a,b + a.x = 0 + a.x = b + a[b] = 'y' + a = 1 - a + b = 1/a + b = 5+4 + a[true] = false +end, + 'LOADNIL', + 'SETTABLE', 'SETTABLE', 'SETTABLE', 'SUB', 'DIV', 'LOADK', + 'SETTABLE', 'RETURN') + +-- constant folding +local function f () return -((2^8 + -(-1)) % 8)/2 * 4 - 3 end + +check(f, 'LOADK', 'RETURN') +assert(f() == -5) + + +-- bug in constant folding for 5.1 +check(function () return -nil end, + 'LOADNIL', 'UNM', 'RETURN') + + +check(function () + local a,b,c + b[c], a = c, b + b[a], a = c, b + a, b = c, a + a = a +end, + 'LOADNIL', + 'MOVE', 'MOVE', 'SETTABLE', + 'MOVE', 'MOVE', 'MOVE', 'SETTABLE', + 'MOVE', 'MOVE', 'MOVE', + -- no code for a = a + 'RETURN') + + +-- x == nil , x ~= nil +checkequal(function () if (a==nil) then a=1 end; if a~=nil then a=1 end end, + function () if (a==9) then a=1 end; if a~=9 then a=1 end end) + +check(function () if a==nil then a=1 end end, +'GETTABUP', 'EQ', 'JMP', 'SETTABUP', 'RETURN') + +-- de morgan +checkequal(function () local a; if not (a or b) then b=a end end, + function () local a; if (not a and not b) then b=a end end) + +checkequal(function (l) local a; return 0 <= a and a <= l end, + function (l) local a; return not (not(a >= 0) or not(a <= l)) end) + + +-- if-goto optimizations +check(function (a) + if a == 1 then goto l1 + elseif a == 2 then goto l2 + elseif a == 3 then goto l2 + else if a == 4 then goto l3 + else goto l3 + end + end + ::l1:: ::l2:: ::l3:: ::l4:: +end, 'EQ', 'JMP', 'EQ', 'JMP', 'EQ', 'JMP', 'EQ', 'JMP', 'JMP', 'RETURN') + +checkequal( +function (a) while a < 10 do a = a + 1 end end, +function (a) ::L2:: if not(a < 10) then goto L1 end; a = a + 1; + goto L2; ::L1:: end +) + +checkequal( +function (a) while a < 10 do a = a + 1 end end, +function (a) while true do if not(a < 10) then break end; a = a + 1; end end +) + +print 'OK' + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/constructs.lc b/luaj-test/src/test/resources/lua5.2.1-tests/constructs.lc new file mode 100644 index 0000000000000000000000000000000000000000..45770976152cf2d0a7ecd305fc200c5e1f155e2f GIT binary patch literal 17248 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 literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/constructs.lua b/luaj-test/src/test/resources/lua5.2.1-tests/constructs.lua new file mode 100644 index 00000000..6dd77fe2 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/constructs.lua @@ -0,0 +1,310 @@ +;;print "testing syntax";; + +local debug = require "debug" + +-- testing semicollons +do ;;; end +; do ; a = 3; assert(a == 3) end; +; + + +-- testing priorities + +assert(2^3^2 == 2^(3^2)); +assert(2^3*4 == (2^3)*4); +assert(2^-2 == 1/4 and -2^- -2 == - - -4); +assert(not nil and 2 and not(2>3 or 3<2)); +assert(-3-1-5 == 0+0-9); +assert(-2^2 == -4 and (-2)^2 == 4 and 2*2-3-1 == 0); +assert(2*1+3/3 == 3 and 1+2 .. 3*1 == "33"); +assert(not(2+1 > 3*1) and "a".."b" > "a"); + +assert(not ((true or false) and nil)) +assert( true or false and nil) + +-- old bug +assert((((1 or false) and true) or false) == true) +assert((((nil and true) or false) and true) == false) + +local a,b = 1,nil; +assert(-(1 or 2) == -1 and (1 and 2)+(-1.25 or -4) == 0.75); +x = ((b or a)+1 == 2 and (10 or a)+1 == 11); assert(x); +x = (((2<3) or 1) == true and (2<3 and 4) == 4); assert(x); + +x,y=1,2; +assert((x>y) and x or y == 2); +x,y=2,1; +assert((x>y) and x or y == 2); + +assert(1234567890 == tonumber('1234567890') and 1234567890+1 == 1234567891) + + +-- silly loops +repeat until 1; repeat until true; +while false do end; while nil do end; + +do -- test old bug (first name could not be an `upvalue') + local a; function f(x) x={a=1}; x={x=1}; x={G=1} end +end + +function f (i) + if type(i) ~= 'number' then return i,'jojo'; end; + if i > 0 then return i, f(i-1); end; +end + +x = {f(3), f(5), f(10);}; +assert(x[1] == 3 and x[2] == 5 and x[3] == 10 and x[4] == 9 and x[12] == 1); +assert(x[nil] == nil) +x = {f'alo', f'xixi', nil}; +assert(x[1] == 'alo' and x[2] == 'xixi' and x[3] == nil); +x = {f'alo'..'xixi'}; +assert(x[1] == 'aloxixi') +x = {f{}} +assert(x[2] == 'jojo' and type(x[1]) == 'table') + + +local f = function (i) + if i < 10 then return 'a'; + elseif i < 20 then return 'b'; + elseif i < 30 then return 'c'; + end; +end + +assert(f(3) == 'a' and f(12) == 'b' and f(26) == 'c' and f(100) == nil) + +for i=1,1000 do break; end; +n=100; +i=3; +t = {}; +a=nil +while not a do + a=0; for i=1,n do for i=i,1,-1 do a=a+1; t[i]=1; end; end; +end +assert(a == n*(n+1)/2 and i==3); +assert(t[1] and t[n] and not t[0] and not t[n+1]) + +function f(b) + local x = 1; + repeat + local a; + if b==1 then local b=1; x=10; break + elseif b==2 then x=20; break; + elseif b==3 then x=30; + else local a,b,c,d=math.sin(1); x=x+1; + end + until x>=12; + return x; +end; + +assert(f(1) == 10 and f(2) == 20 and f(3) == 30 and f(4)==12) + + +local f = function (i) + if i < 10 then return 'a' + elseif i < 20 then return 'b' + elseif i < 30 then return 'c' + else return 8 + end +end + +assert(f(3) == 'a' and f(12) == 'b' and f(26) == 'c' and f(100) == 8) + +local a, b = nil, 23 +x = {f(100)*2+3 or a, a or b+2} +assert(x[1] == 19 and x[2] == 25) +x = {f=2+3 or a, a = b+2} +assert(x.f == 5 and x.a == 25) + +a={y=1} +x = {a.y} +assert(x[1] == 1) + +function f(i) + while 1 do + if i>0 then i=i-1; + else return; end; + end; +end; + +function g(i) + while 1 do + if i>0 then i=i-1 + else return end + end +end + +f(10); g(10); + +do + function f () return 1,2,3; end + local a, b, c = f(); + assert(a==1 and b==2 and c==3) + a, b, c = (f()); + assert(a==1 and b==nil and c==nil) +end + +local a,b = 3 and f(); +assert(a==1 and b==nil) + +function g() f(); return; end; +assert(g() == nil) +function g() return nil or f() end +a,b = g() +assert(a==1 and b==nil) + +print'+'; + + +f = [[ +return function ( a , b , c , d , e ) + local x = a >= b or c or ( d and e ) or nil + return x +end , { a = 1 , b = 2 >= 1 , } or { 1 }; +]] +f = string.gsub(f, "%s+", "\n"); -- force a SETLINE between opcodes +f,a = load(f)(); +assert(a.a == 1 and a.b) + +function g (a,b,c,d,e) + if not (a>=b or c or d and e or nil) then return 0; else return 1; end; +end + +function h (a,b,c,d,e) + while (a>=b or c or (d and e) or nil) do return 1; end; + return 0; +end; + +assert(f(2,1) == true and g(2,1) == 1 and h(2,1) == 1) +assert(f(1,2,'a') == 'a' and g(1,2,'a') == 1 and h(1,2,'a') == 1) +assert(f(1,2,'a') +~= -- force SETLINE before nil +nil, "") +assert(f(1,2,'a') == 'a' and g(1,2,'a') == 1 and h(1,2,'a') == 1) +assert(f(1,2,nil,1,'x') == 'x' and g(1,2,nil,1,'x') == 1 and + h(1,2,nil,1,'x') == 1) +assert(f(1,2,nil,nil,'x') == nil and g(1,2,nil,nil,'x') == 0 and + h(1,2,nil,nil,'x') == 0) +assert(f(1,2,nil,1,nil) == nil and g(1,2,nil,1,nil) == 0 and + h(1,2,nil,1,nil) == 0) + +assert(1 and 2<3 == true and 2<3 and 'a'<'b' == true) +x = 2<3 and not 3; assert(x==false) +x = 2<1 or (2>1 and 'a'); assert(x=='a') + + +do + local a; if nil then a=1; else a=2; end; -- this nil comes as PUSHNIL 2 + assert(a==2) +end + +function F(a) + assert(debug.getinfo(1, "n").name == 'F') + return a,2,3 +end + +a,b = F(1)~=nil; assert(a == true and b == nil); +a,b = F(nil)==nil; assert(a == true and b == nil) + +---------------------------------------------------------------- +-- creates all combinations of +-- [not] ([not] arg op [not] (arg op [not] arg )) +-- and tests each one + +function ID(x) return x end + +function f(t, i) + local b = t.n + local res = math.fmod(math.floor(i/c), b)+1 + c = c*b + return t[res] +end + +local arg = {" ( 1 < 2 ) ", " ( 1 >= 2 ) ", " F ( ) ", " nil "; n=4} + +local op = {" and ", " or ", " == ", " ~= "; n=4} + +local neg = {" ", " not "; n=2} + +local i = 0 +repeat + c = 1 + local s = f(neg, i)..'ID('..f(neg, i)..f(arg, i)..f(op, i).. + f(neg, i)..'ID('..f(arg, i)..f(op, i)..f(neg, i)..f(arg, i)..'))' + local s1 = string.gsub(s, 'ID', '') + K,X,NX,WX1,WX2 = nil + s = string.format([[ + local a = %s + local b = not %s + K = b + local xxx; + if %s then X = a else X = b end + if %s then NX = b else NX = a end + while %s do WX1 = a; break end + while %s do WX2 = a; break end + repeat if (%s) then break end; assert(b) until not(%s) + ]], s1, s, s1, s, s1, s, s1, s, s) + assert(load(s))() + assert(X and not NX and not WX1 == K and not WX2 == K) + if math.fmod(i,4000) == 0 then print('+') end + i = i+1 +until i==c + +print '+' + +------------------------------------------------------------------ +print 'testing short-circuit optimizations' + +_ENV.GLOB1 = 1 +_ENV.GLOB2 = 2 + +local basiccases = { + {"nil", nil}, + {"false", false}, + {"true", true}, + {"10", 10}, + {"(_ENV.GLOB1 < _ENV.GLOB2)", true}, + {"(_ENV.GLOB2 < _ENV.GLOB1)", false}, +} + + +local binops = { + {" and ", function (a,b) if not a then return a else return b end end}, + {" or ", function (a,b) if a then return a else return b end end}, +} + +local mem = {basiccases} -- for memoization + +local function allcases (n) + if mem[n] then return mem[n] end + local res = {} + -- include all smaller cases + for _, v in ipairs(allcases(n - 1)) do + res[#res + 1] = v + end + for i = 1, n - 1 do + for _, v1 in ipairs(allcases(i)) do + for _, v2 in ipairs(allcases(n - i)) do + for _, op in ipairs(binops) do + res[#res + 1] = { + "(" .. v1[1] .. op[1] .. v2[1] .. ")", + op[2](v1[2], v2[2]) + } + end + end + end + print('+') + end + mem[n] = res -- memoize + return res +end + +-- do not do too many combinations for soft tests +local level = _soft and 3 or 4 + +for _, v in pairs(allcases(level)) do + local res = load("return " .. v[1])() + assert(res == v[2]) +end +------------------------------------------------------------------ + +print'OK' diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lc b/luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lc new file mode 100644 index 0000000000000000000000000000000000000000..5118be03b810246da4c0a17f07b666dd4527b08d GIT binary patch literal 38813 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 SWaLQ8M?DHw3g5Jq$p0Td4);$0 literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lua b/luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lua new file mode 100644 index 00000000..85086e58 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lua @@ -0,0 +1,728 @@ +print "testing coroutines" + +local debug = require'debug' + +local f + +local main, ismain = coroutine.running() +assert(type(main) == "thread" and ismain) +assert(not coroutine.resume(main)) +assert(not pcall(coroutine.yield)) + + + +-- tests for multiple yield/resume arguments + +local function eqtab (t1, t2) + assert(#t1 == #t2) + for i = 1, #t1 do + local v = t1[i] + assert(t2[i] == v) + end +end + +_G.x = nil -- declare x +function foo (a, ...) + local x, y = coroutine.running() + assert(x == f and y == false) + assert(coroutine.status(f) == "running") + local arg = {...} + for i=1,#arg do + _G.x = {coroutine.yield(table.unpack(arg[i]))} + end + return table.unpack(a) +end + +f = coroutine.create(foo) +assert(type(f) == "thread" and coroutine.status(f) == "suspended") +assert(string.find(tostring(f), "thread")) +local s,a,b,c,d +s,a,b,c,d = coroutine.resume(f, {1,2,3}, {}, {1}, {'a', 'b', 'c'}) +assert(s and a == nil and coroutine.status(f) == "suspended") +s,a,b,c,d = coroutine.resume(f) +eqtab(_G.x, {}) +assert(s and a == 1 and b == nil) +s,a,b,c,d = coroutine.resume(f, 1, 2, 3) +eqtab(_G.x, {1, 2, 3}) +assert(s and a == 'a' and b == 'b' and c == 'c' and d == nil) +s,a,b,c,d = coroutine.resume(f, "xuxu") +eqtab(_G.x, {"xuxu"}) +assert(s and a == 1 and b == 2 and c == 3 and d == nil) +assert(coroutine.status(f) == "dead") +s, a = coroutine.resume(f, "xuxu") +assert(not s and string.find(a, "dead") and coroutine.status(f) == "dead") + + +-- yields in tail calls +local function foo (i) return coroutine.yield(i) end +f = coroutine.wrap(function () + for i=1,10 do + assert(foo(i) == _G.x) + end + return 'a' +end) +for i=1,10 do _G.x = i; assert(f(i) == i) end +_G.x = 'xuxu'; assert(f('xuxu') == 'a') + +-- recursive +function pf (n, i) + coroutine.yield(n) + pf(n*i, i+1) +end + +f = coroutine.wrap(pf) +local s=1 +for i=1,10 do + assert(f(1, 1) == s) + s = s*i +end + +-- sieve +function gen (n) + return coroutine.wrap(function () + for i=2,n do coroutine.yield(i) end + end) +end + + +function filter (p, g) + return coroutine.wrap(function () + while 1 do + local n = g() + if n == nil then return end + if math.fmod(n, p) ~= 0 then coroutine.yield(n) end + end + end) +end + +local x = gen(100) +local a = {} +while 1 do + local n = x() + if n == nil then break end + table.insert(a, n) + x = filter(n, x) +end + +assert(#a == 25 and a[#a] == 97) + + +-- yielding across C boundaries + +co = coroutine.wrap(function() + assert(not pcall(table.sort,{1,2,3}, coroutine.yield)) + coroutine.yield(20) + return 30 + end) + +assert(co() == 20) +assert(co() == 30) + + +local f = function (s, i) return coroutine.yield(i) end + +local f1 = coroutine.wrap(function () + return xpcall(pcall, function (...) return ... end, + function () + local s = 0 + for i in f, nil, 1 do pcall(function () s = s + i end) end + error({s}) + end) + end) + +f1() +for i = 1, 10 do assert(f1(i) == i) end +local r1, r2, v = f1(nil) +assert(r1 and not r2 and v[1] == (10 + 1)*10/2) + + +function f (a, b) a = coroutine.yield(a); error{a + b} end +function g(x) return x[1]*2 end + +co = coroutine.wrap(function () + coroutine.yield(xpcall(f, g, 10, 20)) + end) + +assert(co() == 10) +r, msg = co(100) +assert(not r and msg == 240) + + +-- errors in coroutines +function foo () + assert(debug.getinfo(1).currentline == debug.getinfo(foo).linedefined + 1) + assert(debug.getinfo(2).currentline == debug.getinfo(goo).linedefined) + coroutine.yield(3) + error(foo) +end + +function goo() foo() end +x = coroutine.wrap(goo) +assert(x() == 3) +local a,b = pcall(x) +assert(not a and b == foo) + +x = coroutine.create(goo) +a,b = coroutine.resume(x) +assert(a and b == 3) +a,b = coroutine.resume(x) +assert(not a and b == foo and coroutine.status(x) == "dead") +a,b = coroutine.resume(x) +assert(not a and string.find(b, "dead") and coroutine.status(x) == "dead") + + +-- co-routines x for loop +function all (a, n, k) + if k == 0 then coroutine.yield(a) + else + for i=1,n do + a[k] = i + all(a, n, k-1) + end + end +end + +local a = 0 +for t in coroutine.wrap(function () all({}, 5, 4) end) do + a = a+1 +end +assert(a == 5^4) + + +-- access to locals of collected corroutines +local C = {}; setmetatable(C, {__mode = "kv"}) +local x = coroutine.wrap (function () + local a = 10 + local function f () a = a+10; return a end + while true do + a = a+1 + coroutine.yield(f) + end + end) + +C[1] = x; + +local f = x() +assert(f() == 21 and x()() == 32 and x() == f) +x = nil +collectgarbage() +assert(C[1] == nil) +assert(f() == 43 and f() == 53) + + +-- old bug: attempt to resume itself + +function co_func (current_co) + assert(coroutine.running() == current_co) + assert(coroutine.resume(current_co) == false) + assert(coroutine.resume(current_co) == false) + return 10 +end + +local co = coroutine.create(co_func) +local a,b = coroutine.resume(co, co) +assert(a == true and b == 10) +assert(coroutine.resume(co, co) == false) +assert(coroutine.resume(co, co) == false) + + +-- attempt to resume 'normal' coroutine +co1 = coroutine.create(function () return co2() end) +co2 = coroutine.wrap(function () + assert(coroutine.status(co1) == 'normal') + assert(not coroutine.resume(co1)) + coroutine.yield(3) + end) + +a,b = coroutine.resume(co1) +assert(a and b == 3) +assert(coroutine.status(co1) == 'dead') + +-- infinite recursion of coroutines +a = function(a) coroutine.wrap(a)(a) end +assert(not pcall(a, a)) + + +-- access to locals of erroneous coroutines +local x = coroutine.create (function () + local a = 10 + _G.f = function () a=a+1; return a end + error('x') + end) + +assert(not coroutine.resume(x)) +-- overwrite previous position of local `a' +assert(not coroutine.resume(x, 1, 1, 1, 1, 1, 1, 1)) +assert(_G.f() == 11) +assert(_G.f() == 12) + + +if not T then + (Message or print)('\a\n >>> testC not active: skipping yield/hook tests <<<\n\a') +else + print "testing yields inside hooks" + + local turn + + function fact (t, x) + assert(turn == t) + if x == 0 then return 1 + else return x*fact(t, x-1) + end + end + + local A,B,a,b = 0,0,0,0 + + local x = coroutine.create(function () + T.sethook("yield 0", "", 2) + A = fact("A", 10) + end) + + local y = coroutine.create(function () + T.sethook("yield 0", "", 3) + B = fact("B", 11) + end) + + while A==0 or B==0 do + if A==0 then turn = "A"; assert(T.resume(x)) end + if B==0 then turn = "B"; assert(T.resume(y)) end + end + + assert(B/A == 11) + + local line = debug.getinfo(1, "l").currentline + 2 -- get line number + local function foo () + local x = 10 --<< this line is 'line' + x = x + 10 + _G.XX = x + end + + -- testing yields in line hook + local co = coroutine.wrap(function () + T.sethook("setglobal X; yield 0", "l", 0); foo(); return 10 end) + + _G.XX = nil; + _G.X = nil; co(); assert(_G.X == line) + _G.X = nil; co(); assert(_G.X == line + 1) + _G.X = nil; co(); assert(_G.X == line + 2 and _G.XX == nil) + _G.X = nil; co(); assert(_G.X == line + 3 and _G.XX == 20) + assert(co() == 10) + + -- testing yields in count hook + co = coroutine.wrap(function () + T.sethook("yield 0", "", 1); foo(); return 10 end) + + _G.XX = nil; + local c = 0 + repeat c = c + 1; local a = co() until a == 10 + assert(_G.XX == 20 and c == 10) + + co = coroutine.wrap(function () + T.sethook("yield 0", "", 2); foo(); return 10 end) + + _G.XX = nil; + local c = 0 + repeat c = c + 1; local a = co() until a == 10 + assert(_G.XX == 20 and c == 5) + _G.X = nil; _G.XX = nil + + + print "testing coroutine API" + + -- reusing a thread + assert(T.testC([[ + newthread # create thread + pushvalue 2 # push body + pushstring 'a a a' # push argument + xmove 0 3 2 # move values to new thread + resume -1, 1 # call it first time + pushstatus + xmove 3 0 0 # move results back to stack + setglobal X # result + setglobal Y # status + pushvalue 2 # push body (to call it again) + pushstring 'b b b' + xmove 0 3 2 + resume -1, 1 # call it again + pushstatus + xmove 3 0 0 + return 1 # return result + ]], function (...) return ... end) == 'b b b') + + assert(X == 'a a a' and Y == 'OK') + + + -- resuming running coroutine + C = coroutine.create(function () + return T.testC([[ + pushnum 10; + pushnum 20; + resume -3 2; + pushstatus + gettop; + return 3]], C) + end) + local a, b, c, d = coroutine.resume(C) + assert(a == true and string.find(b, "non%-suspended") and + c == "ERRRUN" and d == 4) + + a, b, c, d = T.testC([[ + rawgeti R 1 # get main thread + pushnum 10; + pushnum 20; + resume -3 2; + pushstatus + gettop; + return 4]]) + assert(a == coroutine.running() and string.find(b, "non%-suspended") and + c == "ERRRUN" and d == 4) + + + -- using a main thread as a coroutine + local state = T.newstate() + T.loadlib(state) + + assert(T.doremote(state, [[ + coroutine = require'coroutine'; + X = function (x) coroutine.yield(x, 'BB'); return 'CC' end; + return 'ok']])) + + t = table.pack(T.testC(state, [[ + rawgeti R 1 # get main thread + pushstring 'XX' + getglobal X # get function for body + pushstring AA # arg + resume 1 1 # 'resume' shadows previous stack! + gettop + setglobal T # top + setglobal B # second yielded value + setglobal A # fist yielded value + rawgeti R 1 # get main thread + pushnum 5 # arg (noise) + resume 1 1 # after coroutine ends, previous stack is back + pushstatus + gettop + return . + ]])) + assert(t.n == 4 and t[2] == 'XX' and t[3] == 'CC' and t[4] == 'OK') + assert(T.doremote(state, "return T") == '2') + assert(T.doremote(state, "return A") == 'AA') + assert(T.doremote(state, "return B") == 'BB') + + T.closestate(state) + + print'+' + +end + + +-- leaving a pending coroutine open +_X = coroutine.wrap(function () + local a = 10 + local x = function () a = a+1 end + coroutine.yield() + end) + +_X() + + +if not _soft then + -- bug (stack overflow) + local j = 2^9 + local lim = 1000000 -- (C stack limit; assume 32-bit machine) + local t = {lim - 10, lim - 5, lim - 1, lim, lim + 1} + for i = 1, #t do + local j = t[i] + co = coroutine.create(function() + local t = {} + for i = 1, j do t[i] = i end + return table.unpack(t) + end) + local r, msg = coroutine.resume(co) + assert(not r) + end +end + + +assert(coroutine.running() == main) + +print"+" + + +print"testing yields inside metamethods" + +local mt = { + __eq = function(a,b) coroutine.yield(nil, "eq"); return a.x == b.x end, + __lt = function(a,b) coroutine.yield(nil, "lt"); return a.x < b.x end, + __le = function(a,b) coroutine.yield(nil, "le"); return a - b <= 0 end, + __add = function(a,b) coroutine.yield(nil, "add"); return a.x + b.x end, + __sub = function(a,b) coroutine.yield(nil, "sub"); return a.x - b.x end, + __concat = function(a,b) + coroutine.yield(nil, "concat"); + a = type(a) == "table" and a.x or a + b = type(b) == "table" and b.x or b + return a .. b + end, + __index = function (t,k) coroutine.yield(nil, "idx"); return t.k[k] end, + __newindex = function (t,k,v) coroutine.yield(nil, "nidx"); t.k[k] = v end, +} + + +local function new (x) + return setmetatable({x = x, k = {}}, mt) +end + + +local a = new(10) +local b = new(12) +local c = new"hello" + +local function run (f, t) + local i = 1 + local c = coroutine.wrap(f) + while true do + local res, stat = c() + if res then assert(t[i] == nil); return res, t end + assert(stat == t[i]) + i = i + 1 + end +end + + +assert(run(function () if (a>=b) then return '>=' else return '<' end end, + {"le", "sub"}) == "<") +-- '<=' using '<' +mt.__le = nil +assert(run(function () if (a<=b) then return '<=' else return '>' end end, + {"lt"}) == "<=") +assert(run(function () if (a==b) then return '==' else return '~=' end end, + {"eq"}) == "~=") + +assert(run(function () return a..b end, {"concat"}) == "1012") + +assert(run(function() return a .. b .. c .. a end, + {"concat", "concat", "concat"}) == "1012hello10") + +assert(run(function() return "a" .. "b" .. a .. "c" .. c .. b .. "x" end, + {"concat", "concat", "concat"}) == "ab10chello12x") + +assert(run(function () + a.BB = print + return a.BB + end, {"nidx", "idx"}) == print) + +-- getuptable & setuptable +do local _ENV = _ENV + f = function () AAA = BBB + 1; return AAA end +end +g = new(10); g.k.BBB = 10; +debug.setupvalue(f, 1, g) +assert(run(f, {"idx", "nidx", "idx"}) == 11) +assert(g.k.AAA == 11) + +print"+" + +print"testing yields inside 'for' iterators" + +local f = function (s, i) + if i%2 == 0 then coroutine.yield(nil, "for") end + if i < s then return i + 1 end + end + +assert(run(function () + local s = 0 + for i in f, 4, 0 do s = s + i end + return s + end, {"for", "for", "for"}) == 10) + + + +-- tests for coroutine API +if T==nil then + (Message or print)('\a\n >>> testC not active: skipping coroutine API tests <<<\n\a') + return +end + +print('testing coroutine API') + +local function apico (...) + local x = {...} + return coroutine.wrap(function () + return T.testC(table.unpack(x)) + end) +end + +local a = {apico( +[[ + pushstring errorcode + pcallk 1 0 2; + invalid command (should not arrive here) +]], +[[getctx; gettop; return .]], +"stackmark", +error +)()} +assert(#a == 6 and + a[3] == "stackmark" and + a[4] == "errorcode" and + a[5] == "ERRRUN" and + a[6] == 2) -- 'ctx' to pcallk + +local co = apico( + "pushvalue 2; pushnum 10; pcallk 1 2 3; invalid command;", + coroutine.yield, + "getctx; pushvalue 2; pushstring a; pcallk 1 0 4; invalid command", + "getctx; gettop; return .") + +assert(co() == 10) +assert(co(20, 30) == 'a') +a = {co()} +assert(#a == 10 and + a[2] == coroutine.yield and + a[5] == 20 and a[6] == 30 and + a[7] == "YIELD" and a[8] == 3 and + a[9] == "YIELD" and a[10] == 4) +assert(not pcall(co)) -- coroutine is dead now + + +f = T.makeCfunc("pushnum 3; pushnum 5; yield 1;") +co = coroutine.wrap(function () + assert(f() == 23); assert(f() == 23); return 10 +end) +assert(co(23,16) == 5) +assert(co(23,16) == 5) +assert(co(23,16) == 10) + + +-- testing coroutines with C bodies +f = T.makeCfunc([[ + pushnum 102 + yieldk 1 U2 + return 2 +]], +[[ + pushnum 23 # continuation + gettop + return . +]]) + +x = coroutine.wrap(f) +assert(x() == 102) +assert(x() == 23) + + +f = T.makeCfunc[[pushstring 'a'; pushnum 102; yield 2; ]] + +a, b, c, d = T.testC([[newthread; pushvalue 2; xmove 0 3 1; resume 3 0; + pushstatus; xmove 3 0 0; resume 3 0; pushstatus; + return 4; ]], f) + +assert(a == 'YIELD' and b == 'a' and c == 102 and d == 'OK') + + +-- testing chain of suspendable C calls + +local count = 3 -- number of levels + +f = T.makeCfunc([[ + remove 1; # remove argument + pushvalue U3; # get selection function + call 0 1; # call it (result is 'f' or 'yield') + pushstring hello # single argument for selected function + pushupvalueindex 2; # index of continuation program + callk 1 -1 .; # call selected function + errorerror # should never arrive here +]], +[[ + # continuation program + pushnum 34 # return value + gettop + return . # return all results +]], +function () -- selection function + count = count - 1 + if count == 0 then return coroutine.yield + else return f + end +end +) + +co = coroutine.wrap(function () return f(nil) end) +assert(co() == "hello") -- argument to 'yield' +a = {co()} +-- three '34's (one from each pending C call) +assert(#a == 3 and a[1] == a[2] and a[2] == a[3] and a[3] == 34) + + +-- testing yields with continuations + +co = coroutine.wrap(function (...) return + T.testC([[ + getctx + yieldk 3 2 + nonexec error + ]], + [[ # continuation + getctx + yieldk 2 3 + ]], + [[ # continuation + getctx + yieldk 2 4 + ]], + [[ # continuation + pushvalue 6; pushnum 10; pushnum 20; + pcall 2 0 # call should throw an error and execution continues + pop 1 # remove error message + pushvalue 6 + getctx + pcallk 2 2 5 # call should throw an error and jump to continuation + cannot be here! + ]], + [[ # continuation + gettop + return . + ]], + function (a,b) x=a; y=b; error("errmsg") end, + ... +) +end) + +local a = {co(3,4,6)}; assert(a[1] == 6 and a[2] == "OK" and a[3] == 0) +a = {co()}; assert(a[1] == "YIELD" and a[2] == 2) +a = {co()}; assert(a[1] == "YIELD" and a[2] == 3) +a = {co(7,8)}; +-- original arguments +assert(type(a[1]) == 'string' and type(a[2]) == 'string' and + type(a[3]) == 'string' and type(a[4]) == 'string' and + type(a[5]) == 'string' and type(a[6]) == 'function') +-- arguments left from fist resume +assert(a[7] == 3 and a[8] == 4) +-- arguments to last resume +assert(a[9] == 7 and a[10] == 8) +-- error message and nothing more +assert(a[11]:find("errmsg") and #a == 11) +-- check arguments to pcallk +assert(x == "YIELD" and y == 4) + +assert(not pcall(co)) -- coroutine should be dead + +-- testing ctx + +a,b = T.testC( + [[ pushstring print; pcallk 0 0 12 # error + getctx; return 2 ]]) +assert(a == "OK" and b == 0) -- no ctx outside continuations + + +-- bug in nCcalls +local co = coroutine.wrap(function () + local a = {pcall(pcall,pcall,pcall,pcall,pcall,pcall,pcall,error,"hi")} + return pcall(assert, table.unpack(a)) +end) + +local a = {co()} +assert(a[10] == "hi") + + +print'OK' diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/db.lc b/luaj-test/src/test/resources/lua5.2.1-tests/db.lc new file mode 100644 index 0000000000000000000000000000000000000000..258b971bdb7ad695447298cb8cf5089ae7359bc9 GIT binary patch literal 34979 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 D2O?J0 literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/db.lua b/luaj-test/src/test/resources/lua5.2.1-tests/db.lua new file mode 100644 index 00000000..d3d8c25b --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/db.lua @@ -0,0 +1,631 @@ +-- testing debug library + +debug = require "debug" + +local function dostring(s) return assert(load(s))() end + +print"testing debug library and debug information" + +do +local a=1 +end + +function test (s, l, p) + collectgarbage() -- avoid gc during trace + local function f (event, line) + assert(event == 'line') + local l = table.remove(l, 1) + if p then print(l, line) end + assert(l == line, "wrong trace!!") + end + debug.sethook(f,"l"); load(s)(); debug.sethook() + assert(#l == 0) +end + + +do + assert(not pcall(debug.getinfo, print, "X")) -- invalid option + assert(debug.getinfo(1000) == nil) -- out of range level + assert(debug.getinfo(-1) == nil) -- out of range level + local a = debug.getinfo(print) + assert(a.what == "C" and a.short_src == "[C]") + a = debug.getinfo(print, "L") + assert(a.activelines == nil) + local b = debug.getinfo(test, "SfL") + assert(b.name == nil and b.what == "Lua" and b.linedefined == 13 and + b.lastlinedefined == b.linedefined + 10 and + b.func == test and not string.find(b.short_src, "%[")) + assert(b.activelines[b.linedefined + 1] and + b.activelines[b.lastlinedefined]) + assert(not b.activelines[b.linedefined] and + not b.activelines[b.lastlinedefined + 1]) +end + + +-- test file and string names truncation +a = "function f () end" +local function dostring (s, x) return load(s, x)() end +dostring(a) +assert(debug.getinfo(f).short_src == string.format('[string "%s"]', a)) +dostring(a..string.format("; %s\n=1", string.rep('p', 400))) +assert(string.find(debug.getinfo(f).short_src, '^%[string [^\n]*%.%.%."%]$')) +dostring(a..string.format("; %s=1", string.rep('p', 400))) +assert(string.find(debug.getinfo(f).short_src, '^%[string [^\n]*%.%.%."%]$')) +dostring("\n"..a) +assert(debug.getinfo(f).short_src == '[string "..."]') +dostring(a, "") +assert(debug.getinfo(f).short_src == '[string ""]') +dostring(a, "@xuxu") +assert(debug.getinfo(f).short_src == "xuxu") +dostring(a, "@"..string.rep('p', 1000)..'t') +assert(string.find(debug.getinfo(f).short_src, "^%.%.%.p*t$")) +dostring(a, "=xuxu") +assert(debug.getinfo(f).short_src == "xuxu") +dostring(a, string.format("=%s", string.rep('x', 500))) +assert(string.find(debug.getinfo(f).short_src, "^x*$")) +dostring(a, "=") +assert(debug.getinfo(f).short_src == "") +a = nil; f = nil; + + +repeat + local g = {x = function () + local a = debug.getinfo(2) + assert(a.name == 'f' and a.namewhat == 'local') + a = debug.getinfo(1) + assert(a.name == 'x' and a.namewhat == 'field') + return 'xixi' + end} + local f = function () return 1+1 and (not 1 or g.x()) end + assert(f() == 'xixi') + g = debug.getinfo(f) + assert(g.what == "Lua" and g.func == f and g.namewhat == "" and not g.name) + + function f (x, name) -- local! + name = name or 'f' + local a = debug.getinfo(1) + assert(a.name == name and a.namewhat == 'local') + return x + end + + -- breaks in different conditions + if 3>4 then break end; f() + if 3<4 then a=1 else break end; f() + while 1 do local x=10; break end; f() + local b = 1 + if 3>4 then return math.sin(1) end; f() + a = 3<4; f() + a = 3<4 or 1; f() + repeat local x=20; if 4>3 then f() else break end; f() until 1 + g = {} + f(g).x = f(2) and f(10)+f(9) + assert(g.x == f(19)) + function g(x) if not x then return 3 end return (x('a', 'x')) end + assert(g(f) == 'a') +until 1 + +test([[if +math.sin(1) +then + a=1 +else + a=2 +end +]], {2,3,4,7}) + +test([[-- +if nil then + a=1 +else + a=2 +end +]], {2,5,6}) + +test([[a=1 +repeat + a=a+1 +until a==3 +]], {1,3,4,3,4}) + +test([[ do + return +end +]], {2}) + +test([[local a +a=1 +while a<=3 do + a=a+1 +end +]], {1,2,3,4,3,4,3,4,3,5}) + +test([[while math.sin(1) do + if math.sin(1) + then break + end +end +a=1]], {1,2,3,6}) + +test([[for i=1,3 do + a=i +end +]], {1,2,1,2,1,2,1,3}) + +test([[for i,v in pairs{'a','b'} do + a=i..v +end +]], {1,2,1,2,1,3}) + +test([[for i=1,4 do a=1 end]], {1,1,1,1,1}) + + + +print'+' + +-- invalid levels in [gs]etlocal +assert(not pcall(debug.getlocal, 20, 1)) +assert(not pcall(debug.setlocal, -1, 1, 10)) + + +-- parameter names +local function foo (a,b,...) local d, e end +local co = coroutine.create(foo) + +assert(debug.getlocal(foo, 1) == 'a') +assert(debug.getlocal(foo, 2) == 'b') +assert(debug.getlocal(foo, 3) == nil) +assert(debug.getlocal(co, foo, 1) == 'a') +assert(debug.getlocal(co, foo, 2) == 'b') +assert(debug.getlocal(co, foo, 3) == nil) + +assert(debug.getlocal(print, 1) == nil) + + +-- varargs +local function foo (a, ...) + local t = table.pack(...) + for i = 1, t.n do + local n, v = debug.getlocal(1, -i) + assert(n == "(*vararg)" and v == t[i]) + end + assert(not debug.getlocal(1, -(t.n + 1))) + assert(not debug.setlocal(1, -(t.n + 1), 30)) + if t.n > 0 then + (function (x) + assert(debug.setlocal(2, -1, x) == "(*vararg)") + assert(debug.setlocal(2, -t.n, x) == "(*vararg)") + end)(430) + assert(... == 430) + end +end + +foo() +foo(print) +foo(200, 3, 4) +local a = {} +for i = 1,1000 do a[i] = i end +foo(table.unpack(a)) +a = nil + +-- access to vararg in non-vararg function +local function foo () return debug.getlocal(1, -1) end +assert(foo(10) == nil) + + +a = {}; L = nil +local glob = 1 +local oldglob = glob +debug.sethook(function (e,l) + collectgarbage() -- force GC during a hook + local f, m, c = debug.gethook() + assert(m == 'crl' and c == 0) + if e == "line" then + if glob ~= oldglob then + L = l-1 -- get the first line where "glob" has changed + oldglob = glob + end + elseif e == "call" then + local f = debug.getinfo(2, "f").func + a[f] = 1 + else assert(e == "return") + end +end, "crl") + + +function f(a,b) + collectgarbage() + local _, x = debug.getlocal(1, 1) + local _, y = debug.getlocal(1, 2) + assert(x == a and y == b) + assert(debug.setlocal(2, 3, "pera") == "AA".."AA") + assert(debug.setlocal(2, 4, "maçã") == "B") + x = debug.getinfo(2) + assert(x.func == g and x.what == "Lua" and x.name == 'g' and + x.nups == 1 and string.find(x.source, "^@.*db%.lua$")) + glob = glob+1 + assert(debug.getinfo(1, "l").currentline == L+1) + assert(debug.getinfo(1, "l").currentline == L+2) +end + +function foo() + glob = glob+1 + assert(debug.getinfo(1, "l").currentline == L+1) +end; foo() -- set L +-- check line counting inside strings and empty lines + +_ = 'alo\ +alo' .. [[ + +]] +--[[ +]] +assert(debug.getinfo(1, "l").currentline == L+11) -- check count of lines + + +function g(...) + local arg = {...} + do local a,b,c; a=math.sin(40); end + local feijao + local AAAA,B = "xuxu", "mamão" + f(AAAA,B) + assert(AAAA == "pera" and B == "maçã") + do + local B = 13 + local x,y = debug.getlocal(1,5) + assert(x == 'B' and y == 13) + end +end + +g() + + +assert(a[f] and a[g] and a[assert] and a[debug.getlocal] and not a[print]) + + +-- tests for manipulating non-registered locals (C and Lua temporaries) + +local n, v = debug.getlocal(0, 1) +assert(v == 0 and n == "(*temporary)") +local n, v = debug.getlocal(0, 2) +assert(v == 2 and n == "(*temporary)") +assert(not debug.getlocal(0, 3)) +assert(not debug.getlocal(0, 0)) + +function f() + assert(select(2, debug.getlocal(2,3)) == 1) + assert(not debug.getlocal(2,4)) + debug.setlocal(2, 3, 10) + return 20 +end + +function g(a,b) return (a+1) + f() end + +assert(g(0,0) == 30) + + +debug.sethook(nil); +assert(debug.gethook() == nil) + + +-- testing access to function arguments + +X = nil +a = {} +function a:f (a, b, ...) local arg = {...}; local c = 13 end +debug.sethook(function (e) + assert(e == "call") + dostring("XX = 12") -- test dostring inside hooks + -- testing errors inside hooks + assert(not pcall(load("a='joao'+1"))) + debug.sethook(function (e, l) + assert(debug.getinfo(2, "l").currentline == l) + local f,m,c = debug.gethook() + assert(e == "line") + assert(m == 'l' and c == 0) + debug.sethook(nil) -- hook is called only once + assert(not X) -- check that + X = {}; local i = 1 + local x,y + while 1 do + x,y = debug.getlocal(2, i) + if x==nil then break end + X[x] = y + i = i+1 + end + end, "l") +end, "c") + +a:f(1,2,3,4,5) +assert(X.self == a and X.a == 1 and X.b == 2 and X.c == nil) +assert(XX == 12) +assert(debug.gethook() == nil) + + +-- testing upvalue access +local function getupvalues (f) + local t = {} + local i = 1 + while true do + local name, value = debug.getupvalue(f, i) + if not name then break end + assert(not t[name]) + t[name] = value + i = i + 1 + end + return t +end + +local a,b,c = 1,2,3 +local function foo1 (a) b = a; return c end +local function foo2 (x) a = x; return c+b end +assert(debug.getupvalue(foo1, 3) == nil) +assert(debug.getupvalue(foo1, 0) == nil) +assert(debug.setupvalue(foo1, 3, "xuxu") == nil) +local t = getupvalues(foo1) +assert(t.a == nil and t.b == 2 and t.c == 3) +t = getupvalues(foo2) +assert(t.a == 1 and t.b == 2 and t.c == 3) +assert(debug.setupvalue(foo1, 1, "xuxu") == "b") +assert(({debug.getupvalue(foo2, 3)})[2] == "xuxu") +-- upvalues of C functions are allways "called" "" (the empty string) +assert(debug.getupvalue(string.gmatch("x", "x"), 1) == "") + + +-- testing count hooks +local a=0 +debug.sethook(function (e) a=a+1 end, "", 1) +a=0; for i=1,1000 do end; assert(1000 < a and a < 1012) +debug.sethook(function (e) a=a+1 end, "", 4) +a=0; for i=1,1000 do end; assert(250 < a and a < 255) +local f,m,c = debug.gethook() +assert(m == "" and c == 4) +debug.sethook(function (e) a=a+1 end, "", 4000) +a=0; for i=1,1000 do end; assert(a == 0) + +if not _no32 then + debug.sethook(print, "", 2^24 - 1) -- count upperbound + local f,m,c = debug.gethook() + assert(({debug.gethook()})[3] == 2^24 - 1) +end + +debug.sethook() + + +-- tests for tail calls +local function f (x) + if x then + assert(debug.getinfo(1, "S").what == "Lua") + assert(debug.getinfo(1, "t").istailcall == true) + local tail = debug.getinfo(2) + assert(tail.func == g1 and tail.istailcall == true) + assert(debug.getinfo(3, "S").what == "main") + print"+" + end +end + +function g(x) return f(x) end + +function g1(x) g(x) end + +local function h (x) local f=g1; return f(x) end + +h(true) + +local b = {} +debug.sethook(function (e) table.insert(b, e) end, "cr") +h(false) +debug.sethook() +local res = {"return", -- first return (from sethook) + "call", "tail call", "call", "tail call", + "return", "return", + "call", -- last call (to sethook) +} +for i = 1, #res do assert(res[i] == table.remove(b, 1)) end + +b = 0 +debug.sethook(function (e) + if e == "tail call" then + b = b + 1 + assert(debug.getinfo(2, "t").istailcall == true) + else + assert(debug.getinfo(2, "t").istailcall == false) + end + end, "c") +h(false) +debug.sethook() +assert(b == 2) -- two tail calls + +lim = 30000 +if _soft then limit = 3000 end +local function foo (x) + if x==0 then + assert(debug.getinfo(2).what == "main") + local info = debug.getinfo(1) + assert(info.istailcall == true and info.func == foo) + else return foo(x-1) + end +end + +foo(lim) + + +print"+" + + +-- testing local function information +co = load[[ + local A = function () + return x + end + return +]] + +local a = 0 +-- 'A' should be visible to debugger only after its complete definition +debug.sethook(function (e, l) + if l == 3 then a = a + 1; assert(debug.getlocal(2, 1) == "(*temporary)") + elseif l == 4 then a = a + 1; assert(debug.getlocal(2, 1) == "A") + end +end, "l") +co() -- run local function definition +debug.sethook() -- turn off hook +assert(a == 2) -- ensure all two lines where hooked + +-- testing traceback + +assert(debug.traceback(print) == print) +assert(debug.traceback(print, 4) == print) +assert(string.find(debug.traceback("hi", 4), "^hi\n")) +assert(string.find(debug.traceback("hi"), "^hi\n")) +assert(not string.find(debug.traceback("hi"), "'traceback'")) +assert(string.find(debug.traceback("hi", 0), "'traceback'")) +assert(string.find(debug.traceback(), "^stack traceback:\n")) + + +-- testing nparams, nups e isvararg +local t = debug.getinfo(print, "u") +assert(t.isvararg == true and t.nparams == 0 and t.nups == 0) + +t = debug.getinfo(function (a,b,c) end, "u") +assert(t.isvararg == false and t.nparams == 3 and t.nups == 0) + +t = debug.getinfo(function (a,b,...) return t[a] end, "u") +assert(t.isvararg == true and t.nparams == 2 and t.nups == 1) + +t = debug.getinfo(1) -- main +assert(t.isvararg == true and t.nparams == 0 and t.nups == 1 and + debug.getupvalue(t.func, 1) == "_ENV") + + +-- testing debugging of coroutines + +local function checktraceback (co, p, level) + local tb = debug.traceback(co, nil, level) + local i = 0 + for l in string.gmatch(tb, "[^\n]+\n?") do + assert(i == 0 or string.find(l, p[i])) + i = i+1 + end + assert(p[i] == nil) +end + + +local function f (n) + if n > 0 then f(n-1) + else coroutine.yield() end +end + +local co = coroutine.create(f) +coroutine.resume(co, 3) +checktraceback(co, {"yield", "db.lua", "db.lua", "db.lua", "db.lua"}) +checktraceback(co, {"db.lua", "db.lua", "db.lua", "db.lua"}, 1) +checktraceback(co, {"db.lua", "db.lua", "db.lua"}, 2) +checktraceback(co, {"db.lua"}, 4) +checktraceback(co, {}, 40) + + +co = coroutine.create(function (x) + local a = 1 + coroutine.yield(debug.getinfo(1, "l")) + coroutine.yield(debug.getinfo(1, "l").currentline) + return a + end) + +local tr = {} +local foo = function (e, l) if l then table.insert(tr, l) end end +debug.sethook(co, foo, "lcr") + +local _, l = coroutine.resume(co, 10) +local x = debug.getinfo(co, 1, "lfLS") +assert(x.currentline == l.currentline and x.activelines[x.currentline]) +assert(type(x.func) == "function") +for i=x.linedefined + 1, x.lastlinedefined do + assert(x.activelines[i]) + x.activelines[i] = nil +end +assert(next(x.activelines) == nil) -- no 'extra' elements +assert(debug.getinfo(co, 2) == nil) +local a,b = debug.getlocal(co, 1, 1) +assert(a == "x" and b == 10) +a,b = debug.getlocal(co, 1, 2) +assert(a == "a" and b == 1) +debug.setlocal(co, 1, 2, "hi") +assert(debug.gethook(co) == foo) +assert(#tr == 2 and + tr[1] == l.currentline-1 and tr[2] == l.currentline) + +a,b,c = pcall(coroutine.resume, co) +assert(a and b and c == l.currentline+1) +checktraceback(co, {"yield", "in function <"}) + +a,b = coroutine.resume(co) +assert(a and b == "hi") +assert(#tr == 4 and tr[4] == l.currentline+2) +assert(debug.gethook(co) == foo) +assert(debug.gethook() == nil) +checktraceback(co, {}) + + +-- check traceback of suspended (or dead with error) coroutines + +function f(i) if i==0 then error(i) else coroutine.yield(); f(i-1) end end + +co = coroutine.create(function (x) f(x) end) +a, b = coroutine.resume(co, 3) +t = {"'yield'", "'f'", "in function <"} +while coroutine.status(co) == "suspended" do + checktraceback(co, t) + a, b = coroutine.resume(co) + table.insert(t, 2, "'f'") -- one more recursive call to 'f' +end +t[1] = "'error'" +checktraceback(co, t) + + +-- test acessing line numbers of a coroutine from a resume inside +-- a C function (this is a known bug in Lua 5.0) + +local function g(x) + coroutine.yield(x) +end + +local function f (i) + debug.sethook(function () end, "l") + for j=1,1000 do + g(i+j) + end +end + +local co = coroutine.wrap(f) +co(10) +pcall(co) +pcall(co) + + +assert(type(debug.getregistry()) == "table") + + +-- test tagmethod information +local a = {} +local function f (t) + local info = debug.getinfo(1); + assert(info.namewhat == "metamethod") + a.op = info.name + return info.name +end +setmetatable(a, { + __index = f; __add = f; __div = f; __mod = f; __concat = f; __pow = f; + __eq = f; __le = f; __lt = f; +}) + +local b = setmetatable({}, getmetatable(a)) + +assert(a[3] == "__index" and a^3 == "__pow" and a..a == "__concat") +assert(a/3 == "__div" and 3%a == "__mod") +assert (a==b and a.op == "__eq") +assert (a>=b and a.op == "__le") +assert (a>b and a.op == "__lt") + + +print"OK" + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/errors.lc b/luaj-test/src/test/resources/lua5.2.1-tests/errors.lc new file mode 100644 index 0000000000000000000000000000000000000000..9206018502c21a0bacf2073460c2ac4a604d29df GIT binary patch literal 20157 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 literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/errors.lua b/luaj-test/src/test/resources/lua5.2.1-tests/errors.lua new file mode 100644 index 00000000..6d91bdc0 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/errors.lua @@ -0,0 +1,422 @@ +print("testing errors") + +local debug = require"debug" + +-- avoid problems with 'strict' module (which may generate other error messages) +local mt = getmetatable(_G) or {} +local oldmm = mt.__index +mt.__index = nil + +function doit (s) + local f, msg = load(s) + if f == nil then return msg end + local cond, msg = pcall(f) + return (not cond) and msg +end + + +function checkmessage (prog, msg) + local m = doit(prog) + assert(string.find(m, msg, 1, true)) +end + +function checksyntax (prog, extra, token, line) + local msg = doit(prog) + if not string.find(token, "^<%a") and not string.find(token, "^char%(") + then token = "'"..token.."'" end + token = string.gsub(token, "(%p)", "%%%1") + local pt = string.format([[^%%[string ".*"%%]:%d: .- near %s$]], + line, token) + assert(string.find(msg, pt)) + assert(string.find(msg, msg, 1, true)) +end + + +-- test error message with no extra info +assert(doit("error('hi', 0)") == 'hi') + +-- test error message with no info +assert(doit("error()") == nil) + + +-- test common errors/errors that crashed in the past +if not _no32 then + assert(doit("table.unpack({}, 1, n=2^30)")) +end +assert(doit("a=math.sin()")) +assert(not doit("tostring(1)") and doit("tostring()")) +assert(doit"tonumber()") +assert(doit"repeat until 1; a") +assert(doit"return;;") +assert(doit"assert(false)") +assert(doit"assert(nil)") +assert(doit("function a (... , ...) end")) +assert(doit("function a (, ...) end")) +assert(doit("local t={}; t = t[#t] + 1")) + +checksyntax([[ + local a = {4 + +]], "'}' expected (to close '{' at line 1)", "", 3) + + +-- tests for better error messages + +checkmessage("a=1; bbbb=2; a=math.sin(3)+bbbb(3)", "global 'bbbb'") +checkmessage("a=1; local a,bbbb=2,3; a = math.sin(1) and bbbb(3)", + "local 'bbbb'") +checkmessage("a={}; do local a=1 end a:bbbb(3)", "method 'bbbb'") +checkmessage("local a={}; a.bbbb(3)", "field 'bbbb'") +assert(not string.find(doit"a={13}; local bbbb=1; a[bbbb](3)", "'bbbb'")) +checkmessage("a={13}; local bbbb=1; a[bbbb](3)", "number") +checkmessage("a=(1)..{}", "a table value") + +aaa = nil +checkmessage("aaa.bbb:ddd(9)", "global 'aaa'") +checkmessage("local aaa={bbb=1}; aaa.bbb:ddd(9)", "field 'bbb'") +checkmessage("local aaa={bbb={}}; aaa.bbb:ddd(9)", "method 'ddd'") +checkmessage("local a,b,c; (function () a = b+1 end)()", "upvalue 'b'") +assert(not doit"local aaa={bbb={ddd=next}}; aaa.bbb:ddd(nil)") + +checkmessage("local _ENV = {x={}}; a = a + 1", "global 'a'") + +checkmessage("b=1; local aaa='a'; x=aaa+b", "local 'aaa'") +checkmessage("aaa={}; x=3/aaa", "global 'aaa'") +checkmessage("aaa='2'; b=nil;x=aaa*b", "global 'b'") +checkmessage("aaa={}; x=-aaa", "global 'aaa'") +assert(not string.find(doit"aaa={}; x=(aaa or aaa)+(aaa and aaa)", "'aaa'")) +assert(not string.find(doit"aaa={}; (aaa or aaa)()", "'aaa'")) + +checkmessage("print(print < 10)", "function") +checkmessage("print(print < print)", "two function") + + +-- passing light userdata instead of full userdata +_G.D = debug +checkmessage([[ + -- create light udata + local x = D.upvalueid(function () return debug end, 1) + D.setuservalue(x, {}) +]], "light userdata") +_G.D = nil + + +-- global functions +checkmessage("(io.write or print){}", "io.write") +checkmessage("(collectgarbage or print){}", "collectgarbage") + +-- tests for field accesses after RK limit +local t = {} +for i = 1, 1000 do + t[i] = "a = x" .. i +end +local s = table.concat(t, "; ") +t = nil +checkmessage(s.."; a = bbb + 1", "global 'bbb'") +checkmessage("local _ENV=_ENV;"..s.."; a = bbb + 1", "global 'bbb'") +checkmessage(s.."; local t = {}; a = t.bbb + 1", "field 'bbb'") +checkmessage(s.."; local t = {}; t:bbb()", "method 'bbb'") + +checkmessage([[aaa=9 +repeat until 3==3 +local x=math.sin(math.cos(3)) +if math.sin(1) == x then return math.sin(1) end -- tail call +local a,b = 1, { + {x='a'..'b'..'c', y='b', z=x}, + {1,2,3,4,5} or 3+3<=3+3, + 3+1>3+1, + {d = x and aaa[x or y]}} +]], "global 'aaa'") + +checkmessage([[ +local x,y = {},1 +if math.sin(1) == 0 then return 3 end -- return +x.a()]], "field 'a'") + +checkmessage([[ +prefix = nil +insert = nil +while 1 do + local a + if nil then break end + insert(prefix, a) +end]], "global 'insert'") + +checkmessage([[ -- tail call + return math.sin("a") +]], "'sin'") + +checkmessage([[collectgarbage("nooption")]], "invalid option") + +checkmessage([[x = print .. "a"]], "concatenate") + +checkmessage("getmetatable(io.stdin).__gc()", "no value") + +checkmessage([[ +local Var +local function main() + NoSuchName (function() Var=0 end) +end +main() +]], "global 'NoSuchName'") +print'+' + +a = {}; setmetatable(a, {__index = string}) +checkmessage("a:sub()", "bad self") +checkmessage("string.sub('a', {})", "#2") +checkmessage("('a'):sub{}", "#1") + +checkmessage("table.sort({1,2,3}, table.sort)", "'table.sort'") +-- next message may be 'setmetatable' or '_G.setmetatable' +checkmessage("string.gsub('s', 's', setmetatable)", "setmetatable'") + +-- tests for errors in coroutines + +function f (n) + local c = coroutine.create(f) + local a,b = coroutine.resume(c) + return b +end +assert(string.find(f(), "C stack overflow")) + +checkmessage("coroutine.yield()", "outside a coroutine") + +f1 = function () table.sort({1,2,3}, coroutine.yield) end +f = coroutine.wrap(function () return pcall(f1) end) +assert(string.find(select(2, f()), "yield across")) + + +-- testing size of 'source' info; size of buffer for that info is +-- LUA_IDSIZE, declared as 60 in luaconf. Get one position for '\0'. +idsize = 60 - 1 +local function checksize (source) + -- syntax error + local _, msg = load("x", source) + msg = string.match(msg, "^([^:]*):") -- get source (1st part before ':') + assert(msg:len() <= idsize) +end + +for i = 60 - 10, 60 + 10 do -- check border cases around 60 + checksize("@" .. string.rep("x", i)) -- file names + checksize(string.rep("x", i - 10)) -- string sources + checksize("=" .. string.rep("x", i)) -- exact sources +end + + +-- testing line error + +local function lineerror (s, l) + local err,msg = pcall(load(s)) + local line = string.match(msg, ":(%d+):") + assert((line and line+0) == l) +end + +lineerror("local a\n for i=1,'a' do \n print(i) \n end", 2) +lineerror("\n local a \n for k,v in 3 \n do \n print(k) \n end", 3) +lineerror("\n\n for k,v in \n 3 \n do \n print(k) \n end", 4) +lineerror("function a.x.y ()\na=a+1\nend", 1) + +lineerror("a = \na\n+\n{}", 3) +lineerror("a = \n3\n+\n(\n4\n/\nprint)", 6) +lineerror("a = \nprint\n+\n(\n4\n/\n7)", 3) + +lineerror("a\n=\n-\n\nprint\n;", 3) + +lineerror([[ +a +( +23) +]], 1) + +lineerror([[ +local a = {x = 13} +a +. +x +( +23 +) +]], 2) + +lineerror([[ +local a = {x = 13} +a +. +x +( +23 + a +) +]], 6) + +local p = [[ +function g() f() end +function f(x) error('a', X) end +g() +]] +X=3;lineerror((p), 3) +X=0;lineerror((p), nil) +X=1;lineerror((p), 2) +X=2;lineerror((p), 1) + + +if not _soft then + -- several tests that exaust the Lua stack + C = 0 + local l = debug.getinfo(1, "l").currentline; function y () C=C+1; y() end + + local function checkstackmessage (m) + return (string.find(m, "^.-:%d+: stack overflow")) + end + -- repeated stack overflows (to check stack recovery) + assert(checkstackmessage(doit('y()'))) + print('+') + assert(checkstackmessage(doit('y()'))) + print('+') + assert(checkstackmessage(doit('y()'))) + print('+') + + + -- error lines in stack overflow + C = 0 + local l1 + local function g(x) + l1 = debug.getinfo(x, "l").currentline; y() + end + local _, stackmsg = xpcall(g, debug.traceback, 1) + print('+') + local stack = {} + for line in string.gmatch(stackmsg, "[^\n]*") do + local curr = string.match(line, ":(%d+):") + if curr then table.insert(stack, tonumber(curr)) end + end + local i=1 + while stack[i] ~= l1 do + assert(stack[i] == l) + i = i+1 + end + assert(i > 15) + + + -- error in error handling + local res, msg = xpcall(error, error) + assert(not res and type(msg) == 'string') + print('+') + + local function f (x) + if x==0 then error('a\n') + else + local aux = function () return f(x-1) end + local a,b = xpcall(aux, aux) + return a,b + end + end + f(3) + + local function loop (x,y,z) return 1 + loop(x, y, z) end + + local res, msg = xpcall(loop, function (m) + assert(string.find(m, "stack overflow")) + local res, msg = pcall(loop) + assert(string.find(msg, "error handling")) + assert(math.sin(0) == 0) + return 15 + end) + assert(msg == 15) + + res, msg = pcall(function () + for i = 999900, 1000000, 1 do table.unpack({}, 1, i) end + end) + assert(string.find(msg, "too many results")) + +end + + +-- non string messages +function f() error{msg='x'} end +res, msg = xpcall(f, function (r) return {msg=r.msg..'y'} end) +assert(msg.msg == 'xy') + +-- xpcall with arguments +a, b, c = xpcall(string.find, error, "alo", "al") +assert(a and b == 1 and c == 2) +a, b, c = xpcall(string.find, function (x) return {} end, true, "al") +assert(not a and type(b) == "table" and c == nil) + +print('+') +checksyntax("syntax error", "", "error", 1) +checksyntax("1.000", "", "1.000", 1) +checksyntax("[[a]]", "", "[[a]]", 1) +checksyntax("'aa'", "", "'aa'", 1) + +-- test 255 as first char in a chunk +checksyntax("\255a = 1", "", "char(255)", 1) + +doit('I = load("a=9+"); a=3') +assert(a==3 and I == nil) +print('+') + +lim = 1000 +if _soft then lim = 100 end +for i=1,lim do + doit('a = ') + doit('a = 4+nil') +end + + +-- testing syntax limits +local function testrep (init, rep) + local s = "local a; "..init .. string.rep(rep, 400) + local a,b = load(s) + assert(not a and string.find(b, "levels")) +end +testrep("a=", "{") +testrep("a=", "(") +testrep("", "a(") +testrep("", "do ") +testrep("", "while a do ") +testrep("", "if a then else ") +testrep("", "function foo () ") +testrep("a=", "a..") +testrep("a=", "a^") + +local s = ("a,"):rep(200).."a=nil" +local a,b = load(s) +assert(not a and string.find(b, "levels")) + + +-- testing other limits +-- upvalues +local lim = 127 +local s = "local function fooA ()\n local " +for j = 1,lim do + s = s.."a"..j..", " +end +s = s.."b,c\n" +s = s.."local function fooB ()\n local " +for j = 1,lim do + s = s.."b"..j..", " +end +s = s.."b\n" +s = s.."function fooC () return b+c" +local c = 1+2 +for j = 1,lim do + s = s.."+a"..j.."+b"..j + c = c + 2 +end +s = s.."\nend end end" +local a,b = load(s) +assert(c > 255 and string.find(b, "too many upvalues") and + string.find(b, "line 5")) + +-- local variables +s = "\nfunction foo ()\n local " +for j = 1,300 do + s = s.."a"..j..", " +end +s = s.."b\n" +local a,b = load(s) +assert(string.find(b, "line 2")) + +mt.__index = oldmm + +print('OK') diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/events.lc b/luaj-test/src/test/resources/lua5.2.1-tests/events.lc new file mode 100644 index 0000000000000000000000000000000000000000..928b4945ab8e70c6852765016360badc9efdbbcc GIT binary patch literal 24438 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 Bqb2|V literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/events.lua b/luaj-test/src/test/resources/lua5.2.1-tests/events.lua new file mode 100644 index 00000000..b3e5c412 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/events.lua @@ -0,0 +1,388 @@ +print('testing metatables') + +X = 20; B = 30 + +_ENV = setmetatable({}, {__index=_G}) + +collectgarbage() + +X = X+10 +assert(X == 30 and _G.X == 20) +B = false +assert(B == false) +B = nil +assert(B == 30) + +assert(getmetatable{} == nil) +assert(getmetatable(4) == nil) +assert(getmetatable(nil) == nil) +a={}; setmetatable(a, {__metatable = "xuxu", + __tostring=function(x) return x.name end}) +assert(getmetatable(a) == "xuxu") +assert(tostring(a) == nil) +-- cannot change a protected metatable +assert(pcall(setmetatable, a, {}) == false) +a.name = "gororoba" +assert(tostring(a) == "gororoba") + +local a, t = {10,20,30; x="10", y="20"}, {} +assert(setmetatable(a,t) == a) +assert(getmetatable(a) == t) +assert(setmetatable(a,nil) == a) +assert(getmetatable(a) == nil) +assert(setmetatable(a,t) == a) + + +function f (t, i, e) + assert(not e) + local p = rawget(t, "parent") + return (p and p[i]+3), "dummy return" +end + +t.__index = f + +a.parent = {z=25, x=12, [4] = 24} +assert(a[1] == 10 and a.z == 28 and a[4] == 27 and a.x == "10") + +collectgarbage() + +a = setmetatable({}, t) +function f(t, i, v) rawset(t, i, v-3) end +setmetatable(t, t) -- causes a bug in 5.1 ! +t.__newindex = f +a[1] = 30; a.x = "101"; a[5] = 200 +assert(a[1] == 27 and a.x == 98 and a[5] == 197) + + +local c = {} +a = setmetatable({}, t) +t.__newindex = c +a[1] = 10; a[2] = 20; a[3] = 90 +assert(c[1] == 10 and c[2] == 20 and c[3] == 90) + + +do + local a; + a = setmetatable({}, {__index = setmetatable({}, + {__index = setmetatable({}, + {__index = function (_,n) return a[n-3]+4, "lixo" end})})}) + a[0] = 20 + for i=0,10 do + assert(a[i*3] == 20 + i*4) + end +end + + +do -- newindex + local foi + local a = {} + for i=1,10 do a[i] = 0; a['a'..i] = 0; end + setmetatable(a, {__newindex = function (t,k,v) foi=true; rawset(t,k,v) end}) + foi = false; a[1]=0; assert(not foi) + foi = false; a['a1']=0; assert(not foi) + foi = false; a['a11']=0; assert(foi) + foi = false; a[11]=0; assert(foi) + foi = false; a[1]=nil; assert(not foi) + foi = false; a[1]=nil; assert(foi) +end + + +setmetatable(t, nil) +function f (t, ...) return t, {...} end +t.__call = f + +do + local x,y = a(table.unpack{'a', 1}) + assert(x==a and y[1]=='a' and y[2]==1 and y[3]==nil) + x,y = a() + assert(x==a and y[1]==nil) +end + + +local b = setmetatable({}, t) +setmetatable(b,t) + +function f(op) + return function (...) cap = {[0] = op, ...} ; return (...) end +end +t.__add = f("add") +t.__sub = f("sub") +t.__mul = f("mul") +t.__div = f("div") +t.__mod = f("mod") +t.__unm = f("unm") +t.__pow = f("pow") +t.__len = f("len") + +assert(b+5 == b) +assert(cap[0] == "add" and cap[1] == b and cap[2] == 5 and cap[3]==nil) +assert(b+'5' == b) +assert(cap[0] == "add" and cap[1] == b and cap[2] == '5' and cap[3]==nil) +assert(5+b == 5) +assert(cap[0] == "add" and cap[1] == 5 and cap[2] == b and cap[3]==nil) +assert('5'+b == '5') +assert(cap[0] == "add" and cap[1] == '5' and cap[2] == b and cap[3]==nil) +b=b-3; assert(getmetatable(b) == t) +assert(5-a == 5) +assert(cap[0] == "sub" and cap[1] == 5 and cap[2] == a and cap[3]==nil) +assert('5'-a == '5') +assert(cap[0] == "sub" and cap[1] == '5' and cap[2] == a and cap[3]==nil) +assert(a*a == a) +assert(cap[0] == "mul" and cap[1] == a and cap[2] == a and cap[3]==nil) +assert(a/0 == a) +assert(cap[0] == "div" and cap[1] == a and cap[2] == 0 and cap[3]==nil) +assert(a%2 == a) +assert(cap[0] == "mod" and cap[1] == a and cap[2] == 2 and cap[3]==nil) +assert(-a == a) +assert(cap[0] == "unm" and cap[1] == a) +assert(a^4 == a) +assert(cap[0] == "pow" and cap[1] == a and cap[2] == 4 and cap[3]==nil) +assert(a^'4' == a) +assert(cap[0] == "pow" and cap[1] == a and cap[2] == '4' and cap[3]==nil) +assert(4^a == 4) +assert(cap[0] == "pow" and cap[1] == 4 and cap[2] == a and cap[3]==nil) +assert('4'^a == '4') +assert(cap[0] == "pow" and cap[1] == '4' and cap[2] == a and cap[3]==nil) +assert(#a == a) +assert(cap[0] == "len" and cap[1] == a) + + +-- test for rawlen +t = setmetatable({1,2,3}, {__len = function () return 10 end}) +assert(#t == 10 and rawlen(t) == 3) +assert(rawlen"abc" == 3) +assert(not pcall(rawlen, io.stdin)) +assert(not pcall(rawlen, 34)) +assert(not pcall(rawlen)) + +t = {} +t.__lt = function (a,b,c) + collectgarbage() + assert(c == nil) + if type(a) == 'table' then a = a.x end + if type(b) == 'table' then b = b.x end + return aOp(1)) and not(Op(1)>Op(2)) and (Op(2)>Op(1))) + assert(not(Op('a')>Op('a')) and not(Op('a')>Op('b')) and (Op('b')>Op('a'))) + assert((Op(1)>=Op(1)) and not(Op(1)>=Op(2)) and (Op(2)>=Op(1))) + assert((1 >= Op(1)) and not(1 >= Op(2)) and (Op(2) >= 1)) + assert((Op('a')>=Op('a')) and not(Op('a')>=Op('b')) and (Op('b')>=Op('a'))) + assert(('a' >= Op('a')) and not(Op('a') >= 'b') and (Op('b') >= Op('a'))) +end + +test() + +t.__le = function (a,b,c) + assert(c == nil) + if type(a) == 'table' then a = a.x end + if type(b) == 'table' then b = b.x end + return a<=b, "dummy" +end + +test() -- retest comparisons, now using both `lt' and `le' + + +-- test `partial order' + +local function Set(x) + local y = {} + for _,k in pairs(x) do y[k] = 1 end + return setmetatable(y, t) +end + +t.__lt = function (a,b) + for k in pairs(a) do + if not b[k] then return false end + b[k] = nil + end + return next(b) ~= nil +end + +t.__le = nil + +assert(Set{1,2,3} < Set{1,2,3,4}) +assert(not(Set{1,2,3,4} < Set{1,2,3,4})) +assert((Set{1,2,3,4} <= Set{1,2,3,4})) +assert((Set{1,2,3,4} >= Set{1,2,3,4})) +assert((Set{1,3} <= Set{3,5})) -- wrong!! model needs a `le' method ;-) + +t.__le = function (a,b) + for k in pairs(a) do + if not b[k] then return false end + end + return true +end + +assert(not (Set{1,3} <= Set{3,5})) -- now its OK! +assert(not(Set{1,3} <= Set{3,5})) +assert(not(Set{1,3} >= Set{3,5})) + +t.__eq = function (a,b) + for k in pairs(a) do + if not b[k] then return false end + b[k] = nil + end + return next(b) == nil +end + +local s = Set{1,3,5} +assert(s == Set{3,5,1}) +assert(not rawequal(s, Set{3,5,1})) +assert(rawequal(s, s)) +assert(Set{1,3,5,1} == Set{3,5,1}) +assert(Set{1,3,5} ~= Set{3,5,1,6}) +t[Set{1,3,5}] = 1 +assert(t[Set{1,3,5}] == nil) -- `__eq' is not valid for table accesses + + +t.__concat = function (a,b,c) + assert(c == nil) + if type(a) == 'table' then a = a.val end + if type(b) == 'table' then b = b.val end + if A then return a..b + else + return setmetatable({val=a..b}, t) + end +end + +c = {val="c"}; setmetatable(c, t) +d = {val="d"}; setmetatable(d, t) + +A = true +assert(c..d == 'cd') +assert(0 .."a".."b"..c..d.."e".."f"..(5+3).."g" == "0abcdef8g") + +A = false +assert((c..d..c..d).val == 'cdcd') +x = c..d +assert(getmetatable(x) == t and x.val == 'cd') +x = 0 .."a".."b"..c..d.."e".."f".."g" +assert(x.val == "0abcdefg") + + +-- concat metamethod x numbers (bug in 5.1.1) +c = {} +local x +setmetatable(c, {__concat = function (a,b) + assert(type(a) == "number" and b == c or type(b) == "number" and a == c) + return c +end}) +assert(c..5 == c and 5 .. c == c) +assert(4 .. c .. 5 == c and 4 .. 5 .. 6 .. 7 .. c == c) + + +-- test comparison compatibilities +local t1, t2, c, d +t1 = {}; c = {}; setmetatable(c, t1) +d = {} +t1.__eq = function () return true end +t1.__lt = function () return true end +setmetatable(d, t1) +assert(c == d and c < d and not(d <= c)) +t2 = {} +t2.__eq = t1.__eq +t2.__lt = t1.__lt +setmetatable(d, t2) +assert(c == d and c < d and not(d <= c)) + + + +-- test for several levels of calls +local i +local tt = { + __call = function (t, ...) + i = i+1 + if t.f then return t.f(...) + else return {...} + end + end +} + +local a = setmetatable({}, tt) +local b = setmetatable({f=a}, tt) +local c = setmetatable({f=b}, tt) + +i = 0 +x = c(3,4,5) +assert(i == 3 and x[1] == 3 and x[3] == 5) + + +assert(_G.X == 20) + +print'+' + +local _g = _G +_ENV = setmetatable({}, {__index=function (_,k) return _g[k] end}) + + +a = {} +rawset(a, "x", 1, 2, 3) +assert(a.x == 1 and rawget(a, "x", 3) == 1) + +print '+' + +-- testing metatables for basic types +local debug = require'debug' +mt = {} +debug.setmetatable(10, mt) +assert(getmetatable(-2) == mt) +mt.__index = function (a,b) return a+b end +assert((10)[3] == 13) +assert((10)["3"] == 13) +debug.setmetatable(23, nil) +assert(getmetatable(-2) == nil) + +debug.setmetatable(true, mt) +assert(getmetatable(false) == mt) +mt.__index = function (a,b) return a or b end +assert((true)[false] == true) +assert((false)[false] == false) +debug.setmetatable(false, nil) +assert(getmetatable(true) == nil) + +debug.setmetatable(nil, mt) +assert(getmetatable(nil) == mt) +mt.__add = function (a,b) return (a or 0) + (b or 0) end +assert(10 + nil == 10) +assert(nil + 23 == 23) +assert(nil + nil == 0) +debug.setmetatable(nil, nil) +assert(getmetatable(nil) == nil) + +debug.setmetatable(nil, {}) + + +-- loops in delegation +a = {}; setmetatable(a, a); a.__index = a; a.__newindex = a +assert(not pcall(function (a,b) return a[b] end, a, 10)) +assert(not pcall(function (a,b,c) a[b] = c end, a, 10, true)) + +-- bug in 5.1 +T, K, V = nil +grandparent = {} +grandparent.__newindex = function(t,k,v) T=t; K=k; V=v end + +parent = {} +parent.__newindex = parent +setmetatable(parent, grandparent) + +child = setmetatable({}, parent) +child.foo = 10 --> CRASH (on some machines) +assert(T == parent and K == "foo" and V == 10) + +print 'OK' + +return 12 + + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/files.lc b/luaj-test/src/test/resources/lua5.2.1-tests/files.lc new file mode 100644 index 0000000000000000000000000000000000000000..7deb98d0751a7047777a00cf583b32f93bdc187b GIT binary patch literal 32865 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 literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/files.lua b/luaj-test/src/test/resources/lua5.2.1-tests/files.lua new file mode 100644 index 00000000..0793ec6d --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/files.lua @@ -0,0 +1,605 @@ +debug = require "debug" + +assert(type(os.getenv"PATH") == "string") + +assert(io.input(io.stdin) == io.stdin) +assert(not pcall(io.input, "non-existent-file")) +assert(io.output(io.stdout) == io.stdout) + +-- cannot close standard files +assert(not io.close(io.stdin) and + not io.stdout:close() and + not io.stderr:close()) + + +assert(type(io.input()) == "userdata" and io.type(io.output()) == "file") +assert(type(io.stdin) == "userdata" and io.type(io.stderr) == "file") +assert(io.type(8) == nil) +local a = {}; setmetatable(a, {}) +assert(io.type(a) == nil) + +local a,b,c = io.open('xuxu_nao_existe') +assert(not a and type(b) == "string" and type(c) == "number") + +a,b,c = io.open('/a/b/c/d', 'w') +assert(not a and type(b) == "string" and type(c) == "number") + +local file = os.tmpname() +local f, msg = io.open(file, "w") +if not f then + (Message or print)("'os.tmpname' file cannot be open; skipping file tests") + +else --{ most tests here need tmpname +f:close() + +print('testing i/o') + +local otherfile = os.tmpname() + +assert(not pcall(io.open, file, "rw")) -- invalid mode +assert(not pcall(io.open, file, "rb+")) -- invalid mode +assert(not pcall(io.open, file, "r+bk")) -- invalid mode +assert(not pcall(io.open, file, "")) -- invalid mode +assert(not pcall(io.open, file, "+")) -- invalid mode +assert(not pcall(io.open, file, "b")) -- invalid mode +assert(io.open(file, "r+b")):close() +assert(io.open(file, "r+")):close() +assert(io.open(file, "rb")):close() + +assert(os.setlocale('C', 'all')) + +io.input(io.stdin); io.output(io.stdout); + +os.remove(file) +assert(loadfile(file) == nil) +assert(io.open(file) == nil) +io.output(file) +assert(io.output() ~= io.stdout) + +assert(io.output():seek() == 0) +assert(io.write("alo alo"):seek() == string.len("alo alo")) +assert(io.output():seek("cur", -3) == string.len("alo alo")-3) +assert(io.write("joao")) +assert(io.output():seek("end") == string.len("alo joao")) + +assert(io.output():seek("set") == 0) + +assert(io.write('"álo"', "{a}\n", "second line\n", "third line \n")) +assert(io.write('çfourth_line')) +io.output(io.stdout) +collectgarbage() -- file should be closed by GC +assert(io.input() == io.stdin and rawequal(io.output(), io.stdout)) +print('+') + +-- test GC for files +collectgarbage() +for i=1,120 do + for i=1,5 do + io.input(file) + assert(io.open(file, 'r')) + io.lines(file) + end + collectgarbage() +end + +io.input():close() +io.close() + +assert(os.rename(file, otherfile)) +assert(os.rename(file, otherfile) == nil) + +io.output(io.open(otherfile, "ab")) +assert(io.write("\n\n\t\t 3450\n")); +io.close() + +-- test line generators +assert(not pcall(io.lines, "non-existent-file")) +assert(os.rename(otherfile, file)) +io.output(otherfile) +local f = io.lines(file) +while f() do end; +assert(not pcall(f)) -- read lines after EOF +assert(not pcall(f)) -- read lines after EOF +-- copy from file to otherfile +for l in io.lines(file) do io.write(l, "\n") end +io.close() +-- copy from otherfile back to file +local f = assert(io.open(otherfile)) +assert(io.type(f) == "file") +io.output(file) +assert(io.output():read() == nil) +for l in f:lines() do io.write(l, "\n") end +assert(tostring(f):sub(1, 5) == "file ") +assert(f:close()); io.close() +assert(not pcall(io.close, f)) -- error trying to close again +assert(tostring(f) == "file (closed)") +assert(io.type(f) == "closed file") +io.input(file) +f = io.open(otherfile):lines() +for l in io.lines() do assert(l == f()) end +f = nil; collectgarbage() +assert(os.remove(otherfile)) + +io.input(file) +do -- test error returns + local a,b,c = io.input():write("xuxu") + assert(not a and type(b) == "string" and type(c) == "number") +end +assert(io.read(0) == "") -- not eof +assert(io.read(5, '*l') == '"álo"') +assert(io.read(0) == "") +assert(io.read() == "second line") +local x = io.input():seek() +assert(io.read() == "third line ") +assert(io.input():seek("set", x)) +assert(io.read('*L') == "third line \n") +assert(io.read(1) == "ç") +assert(io.read(string.len"fourth_line") == "fourth_line") +assert(io.input():seek("cur", -string.len"fourth_line")) +assert(io.read() == "fourth_line") +assert(io.read() == "") -- empty line +assert(io.read('*n') == 3450) +assert(io.read(1) == '\n') +assert(io.read(0) == nil) -- end of file +assert(io.read(1) == nil) -- end of file +assert(io.read(30000) == nil) -- end of file +assert(({io.read(1)})[2] == nil) +assert(io.read() == nil) -- end of file +assert(({io.read()})[2] == nil) +assert(io.read('*n') == nil) -- end of file +assert(({io.read('*n')})[2] == nil) +assert(io.read('*a') == '') -- end of file (OK for `*a') +assert(io.read('*a') == '') -- end of file (OK for `*a') +collectgarbage() +print('+') +io.close(io.input()) +assert(not pcall(io.read)) + +assert(os.remove(file)) + +local t = '0123456789' +for i=1,12 do t = t..t; end +assert(string.len(t) == 10*2^12) + +io.output(file) +io.write("alo"):write("\n") +io.close() +assert(not pcall(io.write)) +local f = io.open(file, "a+b") +io.output(f) +collectgarbage() + +assert(io.write(' ' .. t .. ' ')) +assert(io.write(';', 'end of file\n')) +f:flush(); io.flush() +f:close() +print('+') + +io.input(file) +assert(io.read() == "alo") +assert(io.read(1) == ' ') +assert(io.read(string.len(t)) == t) +assert(io.read(1) == ' ') +assert(io.read(0)) +assert(io.read('*a') == ';end of file\n') +assert(io.read(0) == nil) +assert(io.close(io.input())) + + +-- test errors in read/write +do + local function ismsg (m) + -- error message is not a code number + return (type(m) == "string" and tonumber(m) == nil) + end + + -- read + local f = io.open(file, "w") + local r, m, c = f:read() + assert(r == nil and ismsg(m) and type(c) == "number") + assert(f:close()) + -- write + f = io.open(file, "r") + r, m, c = f:write("whatever") + assert(r == nil and ismsg(m) and type(c) == "number") + assert(f:close()) + -- lines + f = io.open(file, "w") + r, m = pcall(f:lines()) + assert(r == false and ismsg(m)) + assert(f:close()) +end + +assert(os.remove(file)) + +-- test for *L format +io.output(file); io.write"\n\nline\nother":close() +io.input(file) +assert(io.read"*L" == "\n") +assert(io.read"*L" == "\n") +assert(io.read"*L" == "line\n") +assert(io.read"*L" == "other") +assert(io.read"*L" == nil) +io.input():close() + +local f = assert(io.open(file)) +local s = "" +for l in f:lines("*L") do s = s .. l end +assert(s == "\n\nline\nother") +f:close() + +io.input(file) +s = "" +for l in io.lines(nil, "*L") do s = s .. l end +assert(s == "\n\nline\nother") +io.input():close() + +s = "" +for l in io.lines(file, "*L") do s = s .. l end +assert(s == "\n\nline\nother") + +s = "" +for l in io.lines(file, "*l") do s = s .. l end +assert(s == "lineother") + +io.output(file); io.write"a = 10 + 34\na = 2*a\na = -a\n":close() +local t = {} +load(io.lines(file, "*L"), nil, nil, t)() +assert(t.a == -((10 + 34) * 2)) + + +-- test for multipe arguments in 'lines' +io.output(file); io.write"0123456789\n":close() +for a,b in io.lines(file, 1, 1) do + if a == "\n" then assert(b == nil) + else assert(tonumber(a) == b - 1) + end +end + +for a,b,c in io.lines(file, 1, 2, "*a") do + assert(a == "0" and b == "12" and c == "3456789\n") +end + +for a,b,c in io.lines(file, "*a", 0, 1) do + if a == "" then break end + assert(a == "0123456789\n" and b == nil and c == nil) +end +collectgarbage() -- to close file in previous iteration + +io.output(file); io.write"00\n10\n20\n30\n40\n":close() +for a, b in io.lines(file, "*n", "*n") do + if a == 40 then assert(b == nil) + else assert(a == b - 10) + end +end + + +-- test load x lines +io.output(file); +io.write[[ +local y += X +X = +X * +2 + +X; +X = +X +- y; +]]:close() +_G.X = 1 +assert(not load(io.lines(file))) +collectgarbage() -- to close file in previous iteration +load(io.lines(file, "*L"))() +assert(_G.X == 2) +load(io.lines(file, 1))() +assert(_G.X == 4) +load(io.lines(file, 3))() +assert(_G.X == 8) + +print('+') + +local x1 = "string\n\n\\com \"\"''coisas [[estranhas]] ]]'" +io.output(file) +assert(io.write(string.format("x2 = %q\n-- comment without ending EOS", x1))) +io.close() +assert(loadfile(file))() +assert(x1 == x2) +print('+') +assert(os.remove(file)) +assert(os.remove(file) == nil) +assert(os.remove(otherfile) == nil) + +-- testing loadfile +local function testloadfile (s, expres) + io.output(file) + if s then io.write(s) end + io.close() + local res = assert(loadfile(file))() + assert(os.remove(file)) + assert(res == expres) +end + +-- loading empty file +testloadfile(nil, nil) + +-- loading file with initial comment without end of line +testloadfile("# a non-ending comment", nil) + + +-- checking Unicode BOM in files +testloadfile("\xEF\xBB\xBF# some comment\nreturn 234", 234) +testloadfile("\xEF\xBB\xBFreturn 239", 239) +testloadfile("\xEF\xBB\xBF", nil) -- empty file with a BOM + + +-- checking line numbers in files with initial comments +testloadfile("# a comment\nreturn debug.getinfo(1).currentline", 2) + + +-- loading binary file +io.output(io.open(file, "wb")) +assert(io.write(string.dump(function () return 10, '\0alo\255', 'hi' end))) +io.close() +a, b, c = assert(loadfile(file))() +assert(a == 10 and b == "\0alo\255" and c == "hi") +assert(os.remove(file)) + + +-- loading binary file with initial comment +io.output(io.open(file, "wb")) +assert(io.write("#this is a comment for a binary file\0\n", + string.dump(function () return 20, '\0\0\0' end))) +io.close() +a, b, c = assert(loadfile(file))() +assert(a == 20 and b == "\0\0\0" and c == nil) +assert(os.remove(file)) + + +-- 'loadfile' with 'env' +do + local f = io.open(file, 'w') + f:write[[ + if (...) then a = 15; return b, c, d + else return _ENV + end + ]] + f:close() + local t = {b = 12, c = "xuxu", d = print} + local f = assert(loadfile(file, 't', t)) + local b, c, d = f(1) + assert(t.a == 15 and b == 12 and c == t.c and d == print) + assert(f() == t) + f = assert(loadfile(file, 't', nil)) + assert(f() == nil) + f = assert(loadfile(file)) + assert(f() == _G) + assert(os.remove(file)) +end + + +-- 'loadfile' x modes +do + io.open(file, 'w'):write("return 10"):close() + local s, m = loadfile(file, 'b') + assert(not s and string.find(m, "a text chunk")) + io.open(file, 'w'):write("\27 return 10"):close() + local s, m = loadfile(file, 't') + assert(not s and string.find(m, "a binary chunk")) + assert(os.remove(file)) +end + + +io.output(file) +assert(io.write("qualquer coisa\n")) +assert(io.write("mais qualquer coisa")) +io.close() +assert(io.output(assert(io.open(otherfile, 'wb'))) + :write("outra coisa\0\1\3\0\0\0\0\255\0") + :close()) + +local filehandle = assert(io.open(file, 'r+')) +local otherfilehandle = assert(io.open(otherfile, 'rb')) +assert(filehandle ~= otherfilehandle) +assert(type(filehandle) == "userdata") +assert(filehandle:read('*l') == "qualquer coisa") +io.input(otherfilehandle) +assert(io.read(string.len"outra coisa") == "outra coisa") +assert(filehandle:read('*l') == "mais qualquer coisa") +filehandle:close(); +assert(type(filehandle) == "userdata") +io.input(otherfilehandle) +assert(io.read(4) == "\0\1\3\0") +assert(io.read(3) == "\0\0\0") +assert(io.read(0) == "") -- 255 is not eof +assert(io.read(1) == "\255") +assert(io.read('*a') == "\0") +assert(not io.read(0)) +assert(otherfilehandle == io.input()) +otherfilehandle:close() +assert(os.remove(file)) +assert(os.remove(otherfile)) +collectgarbage() + +io.output(file) + :write[[ + 123.4 -56e-2 not a number +second line +third line + +and the rest of the file +]] + :close() +io.input(file) +local _,a,b,c,d,e,h,__ = io.read(1, '*n', '*n', '*l', '*l', '*l', '*a', 10) +assert(io.close(io.input())) +assert(_ == ' ' and __ == nil) +assert(type(a) == 'number' and a==123.4 and b==-56e-2) +assert(d=='second line' and e=='third line') +assert(h==[[ + +and the rest of the file +]]) +assert(os.remove(file)) +collectgarbage() + +-- testing buffers +do + local f = assert(io.open(file, "w")) + local fr = assert(io.open(file, "r")) + assert(f:setvbuf("full", 2000)) + f:write("x") + assert(fr:read("*all") == "") -- full buffer; output not written yet + f:close() + fr:seek("set") + assert(fr:read("*all") == "x") -- `close' flushes it + f = assert(io.open(file), "w") + assert(f:setvbuf("no")) + f:write("x") + fr:seek("set") + assert(fr:read("*all") == "x") -- no buffer; output is ready + f:close() + f = assert(io.open(file, "a")) + assert(f:setvbuf("line")) + f:write("x") + fr:seek("set", 1) + assert(fr:read("*all") == "") -- line buffer; no output without `\n' + f:write("a\n"):seek("set", 1) + assert(fr:read("*all") == "xa\n") -- now we have a whole line + f:close(); fr:close() + assert(os.remove(file)) +end + + +if not _soft then + print("testing large files (> BUFSIZ)") + io.output(file) + for i=1,5001 do io.write('0123456789123') end + io.write('\n12346'):close() + io.input(file) + local x = io.read('*a') + io.input():seek('set', 0) + local y = io.read(30001)..io.read(1005)..io.read(0).. + io.read(1)..io.read(100003) + assert(x == y and string.len(x) == 5001*13 + 6) + io.input():seek('set', 0) + y = io.read() -- huge line + assert(x == y..'\n'..io.read()) + assert(io.read() == nil) + io.close(io.input()) + assert(os.remove(file)) + x = nil; y = nil +end + +if not _noposix then + print("testing popen/pclose and execute") + local tests = { + -- command, what, code + {"ls > /dev/null", "ok"}, + {"not-to-be-found-command", "exit"}, + {"exit 3", "exit", 3}, + {"exit 129", "exit", 129}, + {"kill -s HUP $$", "signal", 1}, + {"kill -s KILL $$", "signal", 9}, + {"sh -c 'kill -s HUP $$'", "exit"}, + {'lua -e "os.exit(20, true)"', "exit", 20}, + } + print("\n(some error messages are expected now)") + for _, v in ipairs(tests) do + local x, y, z = io.popen(v[1]):close() + local x1, y1, z1 = os.execute(v[1]) + assert(x == x1 and y == y1 and z == z1) + if v[2] == "ok" then + assert(x == true and y == 'exit' and z == 0) + else + assert(x == nil and y == v[2]) -- correct status and 'what' + -- correct code if known (but always different from 0) + assert((v[3] == nil and z > 0) or v[3] == z) + end + end +end + + +-- testing tmpfile +f = io.tmpfile() +assert(io.type(f) == "file") +f:write("alo") +f:seek("set") +assert(f:read"*a" == "alo") + +end --} + +print'+' + + +assert(os.date("") == "") +assert(os.date("!") == "") +local x = string.rep("a", 10000) +assert(os.date(x) == x) +local t = os.time() +T = os.date("*t", t) +assert(os.date(string.rep("%d", 1000), t) == + string.rep(os.date("%d", t), 1000)) +assert(os.date(string.rep("%", 200)) == string.rep("%", 100)) + +local t = os.time() +T = os.date("*t", t) +load(os.date([[assert(T.year==%Y and T.month==%m and T.day==%d and + T.hour==%H and T.min==%M and T.sec==%S and + T.wday==%w+1 and T.yday==%j and type(T.isdst) == 'boolean')]], t))() + +assert(not pcall(os.date, "%9")) -- invalid conversion specifier +assert(not pcall(os.date, "%")) -- invalid conversion specifier +assert(not pcall(os.date, "%O")) -- invalid conversion specifier +assert(not pcall(os.date, "%E")) -- invalid conversion specifier +assert(not pcall(os.date, "%Ea")) -- invalid conversion specifier + +if not _noposix then + assert(type(os.date("%Ex")) == 'string') + assert(type(os.date("%Oy")) == 'string') +end + +assert(os.time(T) == t) +assert(not pcall(os.time, {hour = 12})) + +T = os.date("!*t", t) +load(os.date([[!assert(T.year==%Y and T.month==%m and T.day==%d and + T.hour==%H and T.min==%M and T.sec==%S and + T.wday==%w+1 and T.yday==%j and type(T.isdst) == 'boolean')]], t))() + +do + local T = os.date("*t") + local t = os.time(T) + assert(type(T.isdst) == 'boolean') + T.isdst = nil + local t1 = os.time(T) + assert(t == t1) -- if isdst is absent uses correct default +end + +t = os.time(T) +T.year = T.year-1; +local t1 = os.time(T) +-- allow for leap years +assert(math.abs(os.difftime(t,t1)/(24*3600) - 365) < 2) + +t = os.time() +t1 = os.time(os.date("*t")) +assert(os.difftime(t1,t) <= 2) + +local t1 = os.time{year=2000, month=10, day=1, hour=23, min=12} +local t2 = os.time{year=2000, month=10, day=1, hour=23, min=10, sec=19} +assert(os.difftime(t1,t2) == 60*2-19) + +io.output(io.stdout) +local d = os.date('%d') +local m = os.date('%m') +local a = os.date('%Y') +local ds = os.date('%w') + 1 +local h = os.date('%H') +local min = os.date('%M') +local s = os.date('%S') +io.write(string.format('test done on %2.2d/%2.2d/%d', d, m, a)) +io.write(string.format(', at %2.2d:%2.2d:%2.2d\n', h, min, s)) +io.write(string.format('%s\n', _VERSION)) + + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/gc.lc b/luaj-test/src/test/resources/lua5.2.1-tests/gc.lc new file mode 100644 index 0000000000000000000000000000000000000000..c07f63d1bcf3d4bc5d688110f025b53d39d53a06 GIT binary patch literal 27084 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 10) + assert(dosteps(10) < dosteps(2)) +end + +-- collector should do a full collection with so many steps +assert(dosteps(100000) == 1) +assert(collectgarbage("step", 1000000) == true) +assert(collectgarbage("step", 1000000) == true) + +assert(not collectgarbage("isrunning")) +collectgarbage"restart" +assert(collectgarbage("isrunning")) + + +if not _port then + -- test the pace of the collector + collectgarbage(); collectgarbage() + local x = gcinfo() + collectgarbage"stop" + assert(not collectgarbage("isrunning")) + repeat + local a = {} + until gcinfo() > 3 * x + collectgarbage"restart" + assert(collectgarbage("isrunning")) + repeat + local a = {} + until gcinfo() <= x * 2 +end + + +print("clearing tables") +lim = 15 +a = {} +-- fill a with `collectable' indices +for i=1,lim do a[{}] = i end +b = {} +for k,v in pairs(a) do b[k]=v end +-- remove all indices and collect them +for n in pairs(b) do + a[n] = nil + assert(type(n) == 'table' and next(n) == nil) + collectgarbage() +end +b = nil +collectgarbage() +for n in pairs(a) do error'cannot be here' end +for i=1,lim do a[i] = i end +for i=1,lim do assert(a[i] == i) end + + +print('weak tables') +a = {}; setmetatable(a, {__mode = 'k'}); +-- fill a with some `collectable' indices +for i=1,lim do a[{}] = i end +-- and some non-collectable ones +for i=1,lim do a[i] = i end +for i=1,lim do local s=string.rep('@', i); a[s] = s..'#' end +collectgarbage() +local i = 0 +for k,v in pairs(a) do assert(k==v or k..'#'==v); i=i+1 end +assert(i == 2*lim) + +a = {}; setmetatable(a, {__mode = 'v'}); +a[1] = string.rep('b', 21) +collectgarbage() +assert(a[1]) -- strings are *values* +a[1] = nil +-- fill a with some `collectable' values (in both parts of the table) +for i=1,lim do a[i] = {} end +for i=1,lim do a[i..'x'] = {} end +-- and some non-collectable ones +for i=1,lim do local t={}; a[t]=t end +for i=1,lim do a[i+lim]=i..'x' end +collectgarbage() +local i = 0 +for k,v in pairs(a) do assert(k==v or k-lim..'x' == v); i=i+1 end +assert(i == 2*lim) + +a = {}; setmetatable(a, {__mode = 'vk'}); +local x, y, z = {}, {}, {} +-- keep only some items +a[1], a[2], a[3] = x, y, z +a[string.rep('$', 11)] = string.rep('$', 11) +-- fill a with some `collectable' values +for i=4,lim do a[i] = {} end +for i=1,lim do a[{}] = i end +for i=1,lim do local t={}; a[t]=t end +collectgarbage() +assert(next(a) ~= nil) +local i = 0 +for k,v in pairs(a) do + assert((k == 1 and v == x) or + (k == 2 and v == y) or + (k == 3 and v == z) or k==v); + i = i+1 +end +assert(i == 4) +x,y,z=nil +collectgarbage() +assert(next(a) == string.rep('$', 11)) + + +-- 'bug' in 5.1 +a = {} +local t = {x = 10} +local C = setmetatable({key = t}, {__mode = 'v'}) +local C1 = setmetatable({[t] = 1}, {__mode = 'k'}) +a.x = t -- this should not prevent 't' from being removed from + -- weak table 'C' by the time 'a' is finalized + +setmetatable(a, {__gc = function (u) + assert(C.key == nil) + assert(type(next(C1)) == 'table') + end}) + +a, t = nil +collectgarbage() +collectgarbage() +assert(next(C) == nil and next(C1) == nil) +C, C1 = nil + + +-- ephemerons +local mt = {__mode = 'k'} +a = {10,20,30,40}; setmetatable(a, mt) +x = nil +for i = 1, 100 do local n = {}; a[n] = {k = {x}}; x = n end +GC() +local n = x +local i = 0 +while n do n = a[n].k[1]; i = i + 1 end +assert(i == 100) +x = nil +GC() +for i = 1, 4 do assert(a[i] == i * 10); a[i] = nil end +assert(next(a) == nil) + +local K = {} +a[K] = {} +for i=1,10 do a[K][i] = {}; a[a[K][i]] = setmetatable({}, mt) end +x = nil +local k = 1 +for j = 1,100 do + local n = {}; local nk = k%10 + 1 + a[a[K][nk]][n] = {x, k = k}; x = n; k = nk +end +GC() +local n = x +local i = 0 +while n do local t = a[a[K][k]][n]; n = t[1]; k = t.k; i = i + 1 end +assert(i == 100) +K = nil +GC() +assert(next(a) == nil) + + +-- testing errors during GC +do +collectgarbage("stop") -- stop collection +local u = {} +local s = {}; setmetatable(s, {__mode = 'k'}) +setmetatable(u, {__gc = function (o) + local i = s[o] + s[i] = true + assert(not s[i - 1]) -- check proper finalization order + if i == 8 then error("here") end -- error during GC +end}) + +for i = 6, 10 do + local n = setmetatable({}, getmetatable(u)) + s[n] = i +end + +assert(not pcall(collectgarbage)) +for i = 8, 10 do assert(s[i]) end + +for i = 1, 5 do + local n = setmetatable({}, getmetatable(u)) + s[n] = i +end + +collectgarbage() +for i = 1, 10 do assert(s[i]) end + +getmetatable(u).__gc = false + + +-- __gc errors with non-string messages +setmetatable({}, {__gc = function () error{} end}) +local a, b = pcall(collectgarbage) +assert(not a and type(b) == "string" and string.find(b, "error in __gc")) + +end +print '+' + + +-- testing userdata +if T==nil then + (Message or print)('\a\n >>> testC not active: skipping userdata GC tests <<<\n\a') + +else + + local function newproxy(u) + return debug.setmetatable(T.newuserdata(0), debug.getmetatable(u)) + end + + collectgarbage("stop") -- stop collection + local u = newproxy(nil) + debug.setmetatable(u, {__gc = true}) + local s = 0 + local a = {[u] = 0}; setmetatable(a, {__mode = 'vk'}) + for i=1,10 do a[newproxy(u)] = i end + for k in pairs(a) do assert(getmetatable(k) == getmetatable(u)) end + local a1 = {}; for k,v in pairs(a) do a1[k] = v end + for k,v in pairs(a1) do a[v] = k end + for i =1,10 do assert(a[i]) end + getmetatable(u).a = a1 + getmetatable(u).u = u + do + local u = u + getmetatable(u).__gc = function (o) + assert(a[o] == 10-s) + assert(a[10-s] == nil) -- udata already removed from weak table + assert(getmetatable(o) == getmetatable(u)) + assert(getmetatable(o).a[o] == 10-s) + s=s+1 + end + end + a1, u = nil + assert(next(a) ~= nil) + collectgarbage() + assert(s==11) + collectgarbage() + assert(next(a) == nil) -- finalized keys are removed in two cycles +end + + +-- __gc x weak tables +local u = setmetatable({}, {__gc = true}) +-- __gc metamethod should be collected before running +setmetatable(getmetatable(u), {__mode = "v"}) +getmetatable(u).__gc = function (o) os.exit(1) end -- cannot happen +u = nil +collectgarbage() + +local u = setmetatable({}, {__gc = true}) +local m = getmetatable(u) +m.x = {[{0}] = 1; [0] = {1}}; setmetatable(m.x, {__mode = "kv"}); +m.__gc = function (o) + assert(next(getmetatable(o).x) == nil) + m = 10 +end +u, m = nil +collectgarbage() +assert(m==10) + + +-- errors during collection +u = setmetatable({}, {__gc = function () error "!!!" end}) +u = nil +assert(not pcall(collectgarbage)) + + +if not _soft then + print("deep structures") + local a = {} + for i = 1,200000 do + a = {next = a} + end + collectgarbage() +end + +-- create many threads with self-references and open upvalues +local thread_id = 0 +local threads = {} + +local function fn (thread) + local x = {} + threads[thread_id] = function() + thread = x + end + coroutine.yield() +end + +while thread_id < 1000 do + local thread = coroutine.create(fn) + coroutine.resume(thread, thread) + thread_id = thread_id + 1 +end + +do + collectgarbage() + collectgarbage"stop" + local x = gcinfo() + repeat + for i=1,1000 do _ENV.a = {} end + collectgarbage("step", 1) -- steps should not unblock the collector + until gcinfo() > 2 * x + collectgarbage"restart" +end + + +if T then -- tests for weird cases collecting upvalues + local a = 1200 + local f = function () return a end -- create upvalue for 'a' + assert(f() == 1200) + + -- erase reference to upvalue 'a', mark it as dead, but does not collect it + T.gcstate("pause"); collectgarbage("stop") + f = nil + T.gcstate("sweepstring") + + -- this function will reuse that dead upvalue... + f = function () return a end + assert(f() == 1200) + + -- create coroutine with local variable 'b' + local co = coroutine.wrap(function() + local b = 150 + coroutine.yield(function () return b end) + end) + + T.gcstate("pause") + assert(co()() == 150) -- create upvalue for 'b' + + -- mark upvalue 'b' as dead, but does not collect it + T.gcstate("sweepstring") + + co() -- finish coroutine, "closing" that dead upvalue + + assert(f() == 1200) + collectgarbage("restart") + + print"+" +end + + +if T then + local debug = require "debug" + collectgarbage("generational"); collectgarbage("stop") + x = T.newuserdata(0) + T.gcstate("propagate") -- ensure 'x' is old + T.gcstate("sweepstring") + T.gcstate("propagate") + assert(string.find(T.gccolor(x), "/old")) + local y = T.newuserdata(0) + debug.setmetatable(y, {__gc = true}) -- bless the new udata before... + debug.setmetatable(x, {__gc = true}) -- ...the old one + assert(string.find(T.gccolor(y), "white")) + T.checkmemory() + collectgarbage("incremental"); collectgarbage("restart") +end + + +if T then + print("emergency collections") + collectgarbage() + collectgarbage() + T.totalmem(T.totalmem() + 200) + for i=1,200 do local a = {} end + T.totalmem(1000000000) + collectgarbage() + local t = T.totalmem("table") + local a = {{}, {}, {}} -- create 4 new tables + assert(T.totalmem("table") == t + 4) + t = T.totalmem("function") + a = function () end -- create 1 new closure + assert(T.totalmem("function") == t + 1) + t = T.totalmem("thread") + a = coroutine.create(function () end) -- create 1 new coroutine + assert(T.totalmem("thread") == t + 1) +end + +-- create an object to be collected when state is closed +do + local setmetatable,assert,type,print,getmetatable = + setmetatable,assert,type,print,getmetatable + local tt = {} + tt.__gc = function (o) + assert(getmetatable(o) == tt) + -- create new objects during GC + local a = 'xuxu'..(10+3)..'joao', {} + ___Glob = o -- ressurect object! + setmetatable({}, tt) -- creates a new one with same metatable + print(">>> closing state " .. "<<<\n") + end + local u = setmetatable({}, tt) + ___Glob = {u} -- avoid object being collected before program end +end + +-- create several objects to raise errors when collected while closing state +do + local mt = {__gc = function (o) return o + 1 end} + for i = 1,10 do + -- create object and preserve it until the end + table.insert(___Glob, setmetatable({}, mt)) + end +end + +-- just to make sure +assert(collectgarbage'isrunning') + +print('OK') diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/goto.lc b/luaj-test/src/test/resources/lua5.2.1-tests/goto.lc new file mode 100644 index 0000000000000000000000000000000000000000..d12fde70bd1740cfb0dfb72d8089401d1ab2ac80 GIT binary patch literal 4698 zcmbVP>2p*?5byW);h(EFy@&dfH zm3=p1e&42qAlXlIs)wnS@Nbl-L>CQ6$cW?|gmWZmMvztUWAq1g(-m>qvMLUxW*xdJ zrB!crQ-jrGBQ#6m&j-lHntJ zeEA}DeE7a9BwdpbBJO6y(`R+r6{~>;5l3ID&#qJgn&Y3w*bH=j4i>}6fgi>P*B_G9_+iDKKfP08VjN+O_nCz z-ER9>IZ+(Xx@vfrTSADd^#p-kE045NED*K{Op>?-0)@dAirC;$avU8aa#$_4t?eD#wmJ`bU)0Wwsmo{p9 zOj>qmLiP%$UMs5Ir;yF$^SL}Z_vq2WSZ*?#b|-R0cPQhIW%3#0^daMv46)r1jlw9A zCZrIKtzEWLNOn}oZN_A+@p7+l^lsAg&k<+D0=T!Sk&n_8Ze1V!j89g5N(A>Q?$X|h zpuSljH@mv$`Tn-}PVK@yWbST0>+EV_zQSzkq6vAkFDAPq;}dCE2O$xe*HdsQJeHmG zh~wi08}LeQ2P!t$mb1MXe&a<-zZbu8FYG#&k0*%K*J^K&P z8xR}@5ZvSV;cJawwO7#hBe!vYU!jl}%tyv0^Z!)GedZ}*KMVffa<53yGI=no32oX5_!U@(ra zMXs8Jb)$S9yLKLxvk|U&cX&gV?2eI;;DAaR_%3616~LCJafFt=^rS5`t*-5aGUQRV zy4cseL-&|=aX{k+1`MSqK%qDW8!wOvd+}(#kZsxhm9M9y}3ZQ|I0AuV{yLTS4i1g13r)73(yQ4I{H%M zEA$2zKz|*<3-|UIbpg3HU`eH~{+9MK}olHQ+Fi)i{a%w8k0qwJ-(w|HU+H z4c-TRJK(arcnkOuIxFEP=&XdFp|cWxfzC?!6*^Je3BCc~hEHk!_~K*2N5b3`C3;|y z>C47t-d@i|-8bAw)-q8PGlgOwoz;50I1{wG6#fI!m9PH* literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/goto.lua b/luaj-test/src/test/resources/lua5.2.1-tests/goto.lua new file mode 100644 index 00000000..d8817156 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/goto.lua @@ -0,0 +1,173 @@ +local function errmsg (code, m) + local st, msg = load(code) + assert(not st and string.find(msg, m)) +end + +-- cannot see label inside block +errmsg([[ goto l1; do ::l1:: end ]], "label 'l1'") +errmsg([[ do ::l1:: end goto l1; ]], "label 'l1'") + +-- repeated label +errmsg([[ ::l1:: ::l1:: ]], "label 'l1'") + + +-- undefined label +errmsg([[ goto l1; local aa ::l1:: ::l2:: print(3) ]], "local 'aa'") + +-- jumping over variable definition +errmsg([[ +do local bb, cc; goto l1; end +local aa +::l1:: print(3) +]], "local 'aa'") + +-- jumping into a block +errmsg([[ do ::l1:: end goto l1 ]], "label 'l1'") +errmsg([[ goto l1 do ::l1:: end ]], "label 'l1'") + +-- cannot continue a repeat-until with variables +errmsg([[ + repeat + if x then goto cont end + local xuxu = 10 + ::cont:: + until xuxu < x +]], "local 'xuxu'") + +-- simple gotos +local x +do + local y = 12 + goto l1 + ::l2:: x = x + 1; goto l3 + ::l1:: x = y; goto l2 +end +::l3:: ::l3_1:: assert(x == 13) + + +-- long labels +do + local prog = [[ + do + local a = 1 + goto l%sa; a = a + 1 + ::l%sa:: a = a + 10 + goto l%sb; a = a + 2 + ::l%sb:: a = a + 20 + return a + end + ]] + local label = string.rep("0123456789", 40) + prog = string.format(prog, label, label, label, label) + assert(assert(load(prog))() == 31) +end + +-- goto to correct label when nested +do goto l3; ::l3:: end -- does not loop jumping to previous label 'l3' + +-- ok to jump over local dec. to end of block +do + goto l1 + local a = 23 + x = a + ::l1::; +end + +while true do + goto l4 + goto l1 -- ok to jump over local dec. to end of block + goto l1 -- multiple uses of same label + local x = 45 + ::l1:: ;;; +end +::l4:: assert(x == 13) + +if print then + goto l1 -- ok to jump over local dec. to end of block + error("should not be here") + goto l2 -- ok to jump over local dec. to end of block + local x + ::l1:: ; ::l2:: ;; +else end + +-- to repeat a label in a different function is OK +local function foo () + local a = {} + goto l3 + ::l1:: a[#a + 1] = 1; goto l2; + ::l2:: a[#a + 1] = 2; goto l5; + ::l3:: + ::l3a:: a[#a + 1] = 3; goto l1; + ::l4:: a[#a + 1] = 4; goto l6; + ::l5:: a[#a + 1] = 5; goto l4; + ::l6:: assert(a[1] == 3 and a[2] == 1 and a[3] == 2 and + a[4] == 5 and a[5] == 4) + if not a[6] then a[6] = true; goto l3a end -- do it twice +end + +::l6:: foo() + + + +-------------------------------------------------------------------------------- +-- testing closing of upvalues + +local function foo () + local a = {} + do + local i = 1 + local k = 0 + a[0] = function (y) k = y end + ::l1:: do + local x + if i > 2 then goto l2 end + a[i] = function (y) if y then x = y else return x + k end end + i = i + 1 + goto l1 + end + end + ::l2:: return a +end + +local a = foo() +a[1](10); a[2](20) +assert(a[1]() == 10 and a[2]() == 20 and a[3] == nil) +a[0](13) +assert(a[1]() == 23 and a[2]() == 33) + +-------------------------------------------------------------------------------- +-- testing if x goto optimizations + +local function testG (a) + if a == 1 then + goto l1 + error("should never be here!") + elseif a == 2 then goto l2 + elseif a == 3 then goto l3 + elseif a == 4 then + goto l1 -- go to inside the block + error("should never be here!") + ::l1:: a = a + 1 -- must go to 'if' end + else + goto l4 + ::l4a:: a = a * 2; goto l4b + error("should never be here!") + ::l4:: goto l4a + error("should never be here!") + ::l4b:: + end + do return a end + ::l2:: do return "2" end + ::l3:: do return "3" end + ::l1:: return "1" +end + +assert(testG(1) == "1") +assert(testG(2) == "2") +assert(testG(3) == "3") +assert(testG(4) == 5) +assert(testG(5) == 10) +-------------------------------------------------------------------------------- + + +print'OK' diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/literals.lc b/luaj-test/src/test/resources/lua5.2.1-tests/literals.lc new file mode 100644 index 0000000000000000000000000000000000000000..f7ade8b123fa9ad3283f3b56e8ce3c2bccc0c833 GIT binary patch literal 14000 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' then err = "'"..err.."'" end + assert(not st and string.find(msg, "near "..err, 1, true)) +end +lexerror([["abc\x"]], [[\x"]]) +lexerror([["abc\x]], [[\x]]) +lexerror([["\x]], [[\x]]) +lexerror([["\x5"]], [[\x5"]]) +lexerror([["\x5]], [[\x5]]) +lexerror([["\xr"]], [[\xr]]) +lexerror([["\xr]], [[\xr]]) +lexerror([["\x.]], [[\x.]]) +lexerror([["\x8%"]], [[\x8%]]) +lexerror([["\xAG]], [[\xAG]]) +lexerror([["\g"]], [[\g]]) +lexerror([["\g]], [[\g]]) +lexerror([["\."]], [[\.]]) + +lexerror([["\999"]], [[\999]]) +lexerror([["xyz\300"]], [[\300]]) +lexerror([[" \256"]], [[\256]]) + + +-- unfinished strings +lexerror("[=[alo]]", "") +lexerror("[=[alo]=", "") +lexerror("[=[alo]", "") +lexerror("'alo", "") +lexerror("'alo \\z \n\n", "") +lexerror("'alo \\z", "") +lexerror([['alo \98]], "") + +-- valid characters in variable names +for i = 0, 255 do + local s = string.char(i) + assert(not string.find(s, "[a-zA-Z_]") == not load(s .. "=1")) + assert(not string.find(s, "[a-zA-Z_0-9]") == + not load("a" .. s .. "1 = 1")) +end + + +-- long variable names + +var = string.rep('a', 15000) +prog = string.format("%s = 5", var) +dostring(prog) +assert(_G[var] == 5) +var = nil +print('+') + +-- escapes -- +assert("\n\t" == [[ + + ]]) +assert([[ + + $debug]] == "\n $debug") +assert([[ [ ]] ~= [[ ] ]]) +-- long strings -- +b = "001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789" +assert(string.len(b) == 960) +prog = [=[ +print('+') + +a1 = [["isto e' um string com várias 'aspas'"]] +a2 = "'aspas'" + +assert(string.find(a1, a2) == 31) +print('+') + +a1 = [==[temp = [[um valor qualquer]]; ]==] +assert(load(a1))() +assert(temp == 'um valor qualquer') +-- long strings -- +b = "001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789" +assert(string.len(b) == 960) +print('+') + +a = [[00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +00123456789012345678901234567890123456789123456789012345678901234567890123456789 +]] +assert(string.len(a) == 1863) +assert(string.sub(a, 1, 40) == string.sub(b, 1, 40)) +x = 1 +]=] + +print('+') +x = nil +dostring(prog) +assert(x) + +prog = nil +a = nil +b = nil + + +-- testing line ends +prog = [[ +a = 1 -- a comment +b = 2 + + +x = [=[ +hi +]=] +y = "\ +hello\r\n\ +" +return debug.getinfo(1).currentline +]] + +for _, n in pairs{"\n", "\r", "\n\r", "\r\n"} do + local prog, nn = string.gsub(prog, "\n", n) + assert(dostring(prog) == nn) + assert(_G.x == "hi\n" and _G.y == "\nhello\r\n\n") +end + + +-- testing comments and strings with long brackets +a = [==[]=]==] +assert(a == "]=") + +a = [==[[===[[=[]]=][====[]]===]===]==] +assert(a == "[===[[=[]]=][====[]]===]===") + +a = [====[[===[[=[]]=][====[]]===]===]====] +assert(a == "[===[[=[]]=][====[]]===]===") + +a = [=[]]]]]]]]]=] +assert(a == "]]]]]]]]") + + +--[===[ +x y z [==[ blu foo +]== +] +]=]==] +error error]=]===] + +-- generate all strings of four of these chars +local x = {"=", "[", "]", "\n"} +local len = 4 +local function gen (c, n) + if n==0 then coroutine.yield(c) + else + for _, a in pairs(x) do + gen(c..a, n-1) + end + end +end + +for s in coroutine.wrap(function () gen("", len) end) do + assert(s == load("return [====[\n"..s.."]====]")()) +end + + +-- testing decimal point locale +if os.setlocale("pt_BR") or os.setlocale("ptb") then + assert(not load("á = 3")) -- parser still works with C locale + assert(not load("a = (3,4)")) + assert(tonumber("3,4") == 3.4 and tonumber"3.4" == nil) + assert(assert(load("return 3.4"))() == 3.4) + assert(assert(load("return .4,3"))() == .4) + assert(assert(load("return 4."))() == 4.) + assert(assert(load("return 4.+.5"))() == 4.5) + local a,b = load("return 4.5.") + assert(string.find(b, "'4%.5%.'")) + assert(os.setlocale("C")) +else + (Message or print)( + '\a\n >>> pt_BR locale not available: skipping decimal point tests <<<\n\a') +end + + +-- testing %q x line ends +local s = "a string with \r and \n and \r\n and \n\r" +local c = string.format("return %q", s) +assert(assert(load(c))() == s) + +-- testing errors +assert(not load"a = 'non-ending string") +assert(not load"a = 'non-ending string\n'") +assert(not load"a = '\\345'") +assert(not load"a = [=x]") + +print('OK') diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/locals.lc b/luaj-test/src/test/resources/lua5.2.1-tests/locals.lc new file mode 100644 index 0000000000000000000000000000000000000000..a1c7e088cedec8c5b1131c9ab6b136b0d27c6882 GIT binary patch literal 6848 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 literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/locals.lua b/luaj-test/src/test/resources/lua5.2.1-tests/locals.lua new file mode 100644 index 00000000..a290e5bc --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/locals.lua @@ -0,0 +1,157 @@ +print('testing local variables and environments') + +local debug = require"debug" + + +-- bug in 5.1: + +local function f(x) x = nil; return x end +assert(f(10) == nil) + +local function f() local x; return x end +assert(f(10) == nil) + +local function f(x) x = nil; local y; return x, y end +assert(f(10) == nil and select(2, f(20)) == nil) + +do + local i = 10 + do local i = 100; assert(i==100) end + do local i = 1000; assert(i==1000) end + assert(i == 10) + if i ~= 10 then + local i = 20 + else + local i = 30 + assert(i == 30) + end +end + + + +f = nil + +local f +x = 1 + +a = nil +load('local a = {}')() +assert(a == nil) + +function f (a) + local _1, _2, _3, _4, _5 + local _6, _7, _8, _9, _10 + local x = 3 + local b = a + local c,d = a,b + if (d == b) then + local x = 'q' + x = b + assert(x == 2) + else + assert(nil) + end + assert(x == 3) + local f = 10 +end + +local b=10 +local a; repeat local b; a,b=1,2; assert(a+1==b); until a+b==3 + + +assert(x == 1) + +f(2) +assert(type(f) == 'function') + + +local function getenv (f) + local a,b = debug.getupvalue(f, 1) + assert(a == '_ENV') + return b +end + +-- test for global table of loaded chunks +assert(getenv(load"a=3") == _G) +local c = {}; local f = load("a = 3", nil, nil, c) +assert(getenv(f) == c) +assert(c.a == nil) +f() +assert(c.a == 3) + +-- testing limits for special instructions + +if not _soft then + local a + local p = 4 + for i=2,31 do + for j=-3,3 do + assert(load(string.format([[local a=%s; + a=a+%s; + assert(a ==2^%s)]], j, p-j, i))) () + assert(load(string.format([[local a=%s; + a=a-%s; + assert(a==-2^%s)]], -j, p-j, i))) () + assert(load(string.format([[local a,b=0,%s; + a=b-%s; + assert(a==-2^%s)]], -j, p-j, i))) () + end + p =2*p + end +end + +print'+' + + +if rawget(_G, "querytab") then + -- testing clearing of dead elements from tables + collectgarbage("stop") -- stop GC + local a = {[{}] = 4, [3] = 0, alo = 1, + a1234567890123456789012345678901234567890 = 10} + + local t = querytab(a) + + for k,_ in pairs(a) do a[k] = nil end + collectgarbage() -- restore GC and collect dead fiels in `a' + for i=0,t-1 do + local k = querytab(a, i) + assert(k == nil or type(k) == 'number' or k == 'alo') + end +end + + +-- testing lexical environments + +assert(_ENV == _G) + +do local _ENV = (function (...) return ... end)(_G, dummy) + +do local _ENV = {assert=assert}; assert(true) end +mt = {_G = _G} +local foo,x +do local _ENV = mt + function foo (x) + A = x + do local _ENV = _G; A = 1000 end + return function (x) return A .. x end + end +end +assert(getenv(foo) == mt) +x = foo('hi'); assert(mt.A == 'hi' and A == 1000) +assert(x('*') == mt.A .. '*') + +do local _ENV = {assert=assert, A=10}; + do local _ENV = {assert=assert, A=20}; + assert(A==20);x=A + end + assert(A==10 and x==20) +end +assert(x==20) + + +print('OK') + +return 5,f + +end + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/main.lc b/luaj-test/src/test/resources/lua5.2.1-tests/main.lc new file mode 100644 index 0000000000000000000000000000000000000000..f22684fb740208b604b207586e40b5ff7eb36599 GIT binary patch literal 10329 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 %s", prog, out) +checkout("x\n") + +RUN("env LUA_INIT= LUA_PATH_5_2=y LUA_PATH=x lua %s > %s", prog, out) +checkout("y\n") + +prepfile("print(package.cpath)") + +RUN("env LUA_INIT= LUA_CPATH=xuxu lua %s > %s", prog, out) +checkout("xuxu\n") + +RUN("env LUA_INIT= LUA_CPATH_5_2=yacc LUA_CPATH=x lua %s > %s", prog, out) +checkout("yacc\n") + +prepfile("print(X)") +RUN('env LUA_INIT="X=3" lua %s > %s', prog, out) +checkout("3\n") + +prepfile("print(X)") +RUN('env LUA_INIT_5_2="X=10" LUA_INIT="X=3" lua %s > %s', prog, out) +checkout("10\n") + +-- test option '-E' +prepfile("print(package.path, package.cpath)") +RUN('env LUA_INIT="error(10)" LUA_PATH=xxx LUA_CPATH=xxx lua -E %s > %s', + prog, out) +local defaultpath = getoutput() +defaultpath = string.match(defaultpath, "^(.-)\t") -- remove tab +assert(not string.find(defaultpath, "xxx") and string.find(defaultpath, "lua")) + + +-- test replacement of ';;' to default path +local function convert (p) + prepfile("print(package.path)") + RUN('env LUA_PATH="%s" lua %s > %s', p, prog, out) + local expected = getoutput() + expected = string.sub(expected, 1, -2) -- cut final end of line + assert(string.gsub(p, ";;", ";"..defaultpath..";") == expected) +end + +convert(";") +convert(";;") +convert(";;;") +convert(";;;;") +convert(";;;;;") +convert(";;a;;;bc") + + +-- test 2 files +prepfile("print(1); a=2; return {x=15}") +prepfile(("print(a); print(_G['%s'].x)"):format(prog), otherprog) +RUN('env LUA_PATH="?;;" lua -l %s -l%s -lstring -l io %s > %s', prog, otherprog, otherprog, out) +checkout("1\n2\n15\n2\n15\n") + +local a = [[ + assert(#arg == 3 and arg[1] == 'a' and + arg[2] == 'b' and arg[3] == 'c') + assert(arg[-1] == '--' and arg[-2] == "-e " and arg[-3] == '%s') + assert(arg[4] == nil and arg[-4] == nil) + local a, b, c = ... + assert(... == 'a' and a == 'a' and b == 'b' and c == 'c') +]] +a = string.format(a, progname) +prepfile(a) +RUN('lua "-e " -- %s a b c', prog) + +prepfile"assert(arg==nil)" +prepfile("assert(arg)", otherprog) +RUN('env LUA_PATH="?;;" lua -l%s - < %s', prog, otherprog) + +prepfile"" +RUN("lua - < %s > %s", prog, out) +checkout("") + +-- test many arguments +prepfile[[print(({...})[30])]] +RUN("lua %s %s > %s", prog, string.rep(" a", 30), out) +checkout("a\n") + +RUN([[lua "-eprint(1)" -ea=3 -e "print(a)" > %s]], out) +checkout("1\n3\n") + +prepfile[[ + print( +1, a +) +]] +RUN("lua - < %s > %s", prog, out) +checkout("1\tnil\n") + +prepfile[[ += (6*2-6) -- === +a += 10 +print(a) += a]] +RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out) +checkprogout("6\n10\n10\n\n") + +prepfile("a = [[b\nc\nd\ne]]\n=a") +print("temporary program file: "..prog) +RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out) +checkprogout("b\nc\nd\ne\n\n") + +prompt = "alo" +prepfile[[ -- +a = 2 +]] +RUN([[lua "-e_PROMPT='%s'" -i < %s > %s]], prompt, prog, out) +local t = getoutput() +assert(string.find(t, prompt .. ".*" .. prompt .. ".*" .. prompt)) + +-- test for error objects +prepfile[[ +debug = require "debug" +m = {x=0} +setmetatable(m, {__tostring = function(x) + return debug.getinfo(4).currentline + x.x +end}) +error(m) +]] +NoRun([[lua %s 2> %s]], prog, out) -- no message +checkout(progname..": 6\n") + + +s = [=[ -- +function f ( x ) + local a = [[ +xuxu +]] + local b = "\ +xuxu\n" + if x == 11 then return 1 , 2 end --[[ test multiple returns ]] + return x + 1 + --\\ +end +=( f( 10 ) ) +assert( a == b ) +=f( 11 ) ]=] +s = string.gsub(s, ' ', '\n\n') +prepfile(s) +RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out) +checkprogout("11\n1\t2\n\n") + +prepfile[[#comment in 1st line without \n at the end]] +RUN("lua %s", prog) + +prepfile[[#test line number when file starts with comment line +debug = require"debug" +print(debug.getinfo(1).currentline) +]] +RUN("lua %s > %s", prog, out) +checkprogout('3') + +-- close Lua with an open file +prepfile(string.format([[io.output(%q); io.write('alo')]], out)) +RUN("lua %s", prog) +checkout('alo') + +-- bug in 5.2 beta (extra \0 after version line) +RUN([[lua -v -e'print"hello"' > %s]], out) +t = getoutput() +assert(string.find(t, "PUC%-Rio\nhello")) + + +-- testing os.exit +prepfile("os.exit(nil, true)") +RUN("lua %s", prog) +prepfile("os.exit(0, true)") +RUN("lua %s", prog) +prepfile("os.exit(true, true)") +RUN("lua %s", prog) +prepfile("os.exit(1, true)") +NoRun("lua %s", prog) -- no message +prepfile("os.exit(false, true)") +NoRun("lua %s", prog) -- no message + +assert(os.remove(prog)) +assert(os.remove(otherprog)) +assert(not os.remove(out)) + +RUN("lua -v") + +NoRunMsg("lua -h") +NoRunMsg("lua -e") +NoRunMsg("lua -e a") +NoRunMsg("lua -f") + +print("OK") diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/math.lc b/luaj-test/src/test/resources/lua5.2.1-tests/math.lc new file mode 100644 index 0000000000000000000000000000000000000000..2d2b723417d611d851c52295b475550495c55120 GIT binary patch literal 17525 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 literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/math.lua b/luaj-test/src/test/resources/lua5.2.1-tests/math.lua new file mode 100644 index 00000000..9599209c --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/math.lua @@ -0,0 +1,293 @@ +print("testing numbers and math lib") + + +-- basic float notation +assert(0e12 == 0 and .0 == 0 and 0. == 0 and .2e2 == 20 and 2.E-1 == 0.2) + +do + local a,b,c = "2", " 3e0 ", " 10 " + assert(a+b == 5 and -b == -3 and b+"2" == 5 and "10"-c == 0) + assert(type(a) == 'string' and type(b) == 'string' and type(c) == 'string') + assert(a == "2" and b == " 3e0 " and c == " 10 " and -c == -" 10 ") + assert(c%a == 0 and a^b == 08) + a = 0 + assert(a == -a) + -- luaj folds -0 into 0 + -- assert(0 == -0) +end + +do + local x = -1 + local mz = 0/x -- minus zero + t = {[0] = 10, 20, 30, 40, 50} + assert(t[mz] == t[0]) + -- luaj folds -0 into 0 + -- assert(t[-0] == t[0]) +end + +do + local a,b = math.modf(3.5) + assert(a == 3 and b == 0.5) + assert(math.huge > 10e30) + assert(-math.huge < -10e30) +end + +function f(...) + if select('#', ...) == 1 then + return (...) + else + return "***" + end +end + + +-- testing numeric strings + +assert("2" + 1 == 3) +assert("2 " + 1 == 3) +assert(" -2 " + 1 == -1) +assert(" -0xa " + 1 == -9) + + +-- testing 'tonumber' +assert(tonumber{} == nil) +assert(tonumber'+0.01' == 1/100 and tonumber'+.01' == 0.01 and + tonumber'.01' == 0.01 and tonumber'-1.' == -1 and + tonumber'+1.' == 1) +assert(tonumber'+ 0.01' == nil and tonumber'+.e1' == nil and + tonumber'1e' == nil and tonumber'1.0e+' == nil and + tonumber'.' == nil) +assert(tonumber('-012') == -010-2) +assert(tonumber('-1.2e2') == - - -120) + +assert(tonumber("0xffffffffffff") == 2^(4*12) - 1) +assert(tonumber("0x"..string.rep("f", 150)) == 2^(4*150) - 1) +assert(tonumber('0x3.' .. string.rep('0', 100)) == 3) +assert(tonumber('0x0.' .. string.rep('0', 150).."1") == 2^(-4*151)) + +-- testing 'tonumber' with base +assert(tonumber(' 001010 ', 2) == 10) +assert(tonumber(' 001010 ', 10) == 001010) +assert(tonumber(' -1010 ', 2) == -10) +assert(tonumber('10', 36) == 36) +assert(tonumber(' -10 ', 36) == -36) +assert(tonumber(' +1Z ', 36) == 36 + 35) +assert(tonumber(' -1z ', 36) == -36 + -35) +assert(tonumber('-fFfa', 16) == -(10+(16*(15+(16*(15+(16*15))))))) +assert(tonumber(string.rep('1', 42), 2) + 1 == 2^42) +assert(tonumber(string.rep('1', 34), 2) + 1 == 2^34) +assert(tonumber('ffffFFFF', 16)+1 == 2^32) +assert(tonumber('0ffffFFFF', 16)+1 == 2^32) +assert(tonumber('-0ffffffFFFF', 16) - 1 == -2^40) +for i = 2,36 do + assert(tonumber('\t10000000000\t', i) == i^10) +end + +-- testing 'tonumber' fo invalid formats +assert(f(tonumber('fFfa', 15)) == nil) +assert(f(tonumber('099', 8)) == nil) +assert(f(tonumber('1\0', 2)) == nil) +assert(f(tonumber('', 8)) == nil) +assert(f(tonumber(' ', 9)) == nil) +assert(f(tonumber(' ', 9)) == nil) +assert(f(tonumber('0xf', 10)) == nil) + +assert(f(tonumber('inf')) == nil) +assert(f(tonumber(' INF ')) == nil) +assert(f(tonumber('Nan')) == nil) +assert(f(tonumber('nan')) == nil) + +assert(f(tonumber(' ')) == nil) +assert(f(tonumber('')) == nil) +assert(f(tonumber('1 a')) == nil) +assert(f(tonumber('1\0')) == nil) +assert(f(tonumber('1 \0')) == nil) +assert(f(tonumber('1\0 ')) == nil) +assert(f(tonumber('e1')) == nil) +assert(f(tonumber('e 1')) == nil) +assert(f(tonumber(' 3.4.5 ')) == nil) + + +-- testing 'tonumber' for invalid hexadecimal formats + +assert(tonumber('0x') == nil) +assert(tonumber('x') == nil) +assert(tonumber('x3') == nil) +assert(tonumber('00x2') == nil) +assert(tonumber('0x 2') == nil) +assert(tonumber('0 x2') == nil) +assert(tonumber('23x') == nil) +assert(tonumber('- 0xaa') == nil) + + +-- testing hexadecimal numerals + +assert(0x10 == 16 and 0xfff == 2^12 - 1 and 0XFB == 251) +assert(0x0p12 == 0 and 0x.0p-3 == 0) +assert(0xFFFFFFFF == 2^32 - 1) +assert(tonumber('+0x2') == 2) +assert(tonumber('-0xaA') == -170) +assert(tonumber('-0xffFFFfff') == -2^32 + 1) + +-- possible confusion with decimal exponent +assert(0E+1 == 0 and 0xE+1 == 15 and 0xe-1 == 13) + + +-- floating hexas + +assert(tonumber(' 0x2.5 ') == 0x25/16) +assert(tonumber(' -0x2.5 ') == -0x25/16) +assert(tonumber(' +0x0.51p+8 ') == 0x51) +assert(tonumber('0x0.51p') == nil) +assert(tonumber('0x5p+-2') == nil) +assert(0x.FfffFFFF == 1 - '0x.00000001') +assert('0xA.a' + 0 == 10 + 10/16) +assert(0xa.aP4 == 0XAA) +assert(0x4P-2 == 1) +assert(0x1.1 == '0x1.' + '+0x.1') + + +assert(1.1 == 1.+.1) +assert(100.0 == 1E2 and .01 == 1e-2) +assert(1111111111111111-1111111111111110== 1000.00e-03) +-- 1234567890123456 +assert(1.1 == '1.'+'.1') +assert('1111111111111111'-'1111111111111110' == tonumber" +0.001e+3 \n\t") + +function eq (a,b,limit) + if not limit then limit = 10E-10 end + return math.abs(a-b) <= limit +end + +assert(0.1e-30 > 0.9E-31 and 0.9E30 < 0.1e31) + +assert(0.123456 > 0.123455) + +assert(tonumber('+1.23E18') == 1.23*10^18) + +-- testing order operators +assert(not(1<1) and (1<2) and not(2<1)) +assert(not('a'<'a') and ('a'<'b') and not('b'<'a')) +assert((1<=1) and (1<=2) and not(2<=1)) +assert(('a'<='a') and ('a'<='b') and not('b'<='a')) +assert(not(1>1) and not(1>2) and (2>1)) +assert(not('a'>'a') and not('a'>'b') and ('b'>'a')) +assert((1>=1) and not(1>=2) and (2>=1)) +assert(('a'>='a') and not('a'>='b') and ('b'>='a')) + +-- testing mod operator +assert(-4%3 == 2) +assert(4%-3 == -2) +assert(math.pi - math.pi % 1 == 3) +assert(math.pi - math.pi % 0.001 == 3.141) + +local function testbit(a, n) + return a/2^n % 2 >= 1 +end + +assert(eq(math.sin(-9.8)^2 + math.cos(-9.8)^2, 1)) +assert(eq(math.tan(math.pi/4), 1)) +assert(eq(math.sin(math.pi/2), 1) and eq(math.cos(math.pi/2), 0)) +assert(eq(math.atan(1), math.pi/4) and eq(math.acos(0), math.pi/2) and + eq(math.asin(1), math.pi/2)) +assert(eq(math.deg(math.pi/2), 90) and eq(math.rad(90), math.pi/2)) +assert(math.abs(-10) == 10) +assert(eq(math.atan2(1,0), math.pi/2)) +assert(math.ceil(4.5) == 5.0) +assert(math.floor(4.5) == 4.0) +assert(math.fmod(10,3) == 1) +assert(eq(math.sqrt(10)^2, 10)) +assert(eq(math.log(2, 10), math.log(2)/math.log(10))) +assert(eq(math.log(2, 2), 1)) +assert(eq(math.log(9, 3), 2)) +assert(eq(math.exp(0), 1)) +assert(eq(math.sin(10), math.sin(10%(2*math.pi)))) +local v,e = math.frexp(math.pi) +assert(eq(math.ldexp(v,e), math.pi)) + +assert(eq(math.tanh(3.5), math.sinh(3.5)/math.cosh(3.5))) + +assert(tonumber(' 1.3e-2 ') == 1.3e-2) +assert(tonumber(' -1.00000000000001 ') == -1.00000000000001) + +-- testing constant limits +-- 2^23 = 8388608 +assert(8388609 + -8388609 == 0) +assert(8388608 + -8388608 == 0) +assert(8388607 + -8388607 == 0) + +-- testing implicit convertions + +local a,b = '10', '20' +assert(a*b == 200 and a+b == 30 and a-b == -10 and a/b == 0.5 and -b == -20) +assert(a == '10' and b == '20') + + +if not _port then + print("testing -0 and NaN") + --[[ luaj folds -0 into 0 + local mz, z = -0, 0 + assert(mz == z) + assert(1/mz < 0 and 0 < 1/z) + local a = {[mz] = 1} + assert(a[z] == 1 and a[mz] == 1) + local inf = math.huge * 2 + 1 + --]] + local mz, z = -1/inf, 1/inf + assert(mz == z) + assert(1/mz < 0 and 0 < 1/z) + local NaN = inf - inf + assert(NaN ~= NaN) + assert(not (NaN < NaN)) + assert(not (NaN <= NaN)) + assert(not (NaN > NaN)) + assert(not (NaN >= NaN)) + assert(not (0 < NaN) and not (NaN < 0)) + local NaN1 = 0/0 + assert(NaN ~= NaN1 and not (NaN <= NaN1) and not (NaN1 <= NaN)) + local a = {} + assert(not pcall(function () a[NaN] = 1 end)) + assert(a[NaN] == nil) + a[1] = 1 + assert(not pcall(function () a[NaN] = 1 end)) + assert(a[NaN] == nil) + -- string with same binary representation as 0.0 (may create problems + -- for constant manipulation in the pre-compiler) + -- local a1, a2, a3, a4, a5 = 0, 0, "\0\0\0\0\0\0\0\0", 0, "\0\0\0\0\0\0\0\0" + -- assert(a1 == a2 and a2 == a4 and a1 ~= a3) + -- assert(a3 == a5) +end + + +if not _port then + print("testing 'math.random'") + math.randomseed(0) + + local function aux (x1, x2, p) + local Max = -math.huge + local Min = math.huge + for i = 0, 20000 do + local t = math.random(table.unpack(p)) + Max = math.max(Max, t) + Min = math.min(Min, t) + if eq(Max, x2, 0.001) and eq(Min, x1, 0.001) then + goto ok + end + end + -- loop ended without satisfing condition + assert(false) + ::ok:: + assert(x1 <= Min and Max<=x2) + end + + aux(0, 1, {}) + aux(-10, 0, {-10,0}) +end + +for i=1,10 do + local t = math.random(5) + assert(1 <= t and t <= 5) +end + + +print('OK') diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/nextvar.lc b/luaj-test/src/test/resources/lua5.2.1-tests/nextvar.lc new file mode 100644 index 0000000000000000000000000000000000000000..a66b5a7ab7a3baa04fb4ad08776f012590d8a38d GIT binary patch literal 25397 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 n + local mp = 2^math.ceil(log2(n)) + assert(n == 0 or (mp/2 < n and n <= mp)) + return mp +end + +local function fb (n) + local r, nn = T.int2fb(n) + assert(r < 256) + return nn +end + +-- test fb function +local a = 1 +local lim = 2^30 +while a < lim do + local n = fb(a) + assert(a <= n and n <= a*1.125) + a = math.ceil(a*1.3) +end + + +local function check (t, na, nh) + local a, h = T.querytab(t) + if a ~= na or h ~= nh then + print(na, nh, a, h) + assert(nil) + end +end + + +-- testing C library sizes +do + local s = 0 + for _ in pairs(math) do s = s + 1 end + check(math, 0, mp2(s)) +end + + +-- testing constructor sizes +local lim = 40 +local s = 'return {' +for i=1,lim do + s = s..i..',' + local s = s + for k=0,lim do + local t = load(s..'}')() + assert(#t == i) + check(t, fb(i), mp2(k)) + s = string.format('%sa%d=%d,', s, k, k) + end +end + + +-- tests with unknown number of elements +local a = {} +for i=1,lim do a[i] = i end -- build auxiliary table +for k=0,lim do + local a = {table.unpack(a,1,k)} + assert(#a == k) + check(a, k, 0) + a = {1,2,3,table.unpack(a,1,k)} + check(a, k+3, 0) + assert(#a == k + 3) +end + + +-- testing tables dynamically built +local lim = 130 +local a = {}; a[2] = 1; check(a, 0, 1) +a = {}; a[0] = 1; check(a, 0, 1); a[2] = 1; check(a, 0, 2) +a = {}; a[0] = 1; a[1] = 1; check(a, 1, 1) +a = {} +for i = 1,lim do + a[i] = 1 + assert(#a == i) + check(a, mp2(i), 0) +end + +a = {} +for i = 1,lim do + a['a'..i] = 1 + assert(#a == 0) + check(a, 0, mp2(i)) +end + +a = {} +for i=1,16 do a[i] = i end +check(a, 16, 0) +if not _port then + for i=1,11 do a[i] = nil end + for i=30,50 do a[i] = nil end -- force a rehash (?) + check(a, 0, 8) -- only 5 elements in the table + a[10] = 1 + for i=30,50 do a[i] = nil end -- force a rehash (?) + check(a, 0, 8) -- only 6 elements in the table + for i=1,14 do a[i] = nil end + for i=18,50 do a[i] = nil end -- force a rehash (?) + check(a, 0, 4) -- only 2 elements ([15] and [16]) +end + +-- reverse filling +for i=1,lim do + local a = {} + for i=i,1,-1 do a[i] = i end -- fill in reverse + check(a, mp2(i), 0) +end + +-- size tests for vararg +lim = 35 +function foo (n, ...) + local arg = {...} + check(arg, n, 0) + assert(select('#', ...) == n) + arg[n+1] = true + check(arg, mp2(n+1), 0) + arg.x = true + check(arg, mp2(n+1), 1) +end +local a = {} +for i=1,lim do a[i] = true; foo(i, table.unpack(a)) end + +end --] + + +-- test size operation on empty tables +assert(#{} == 0) +assert(#{nil} == 0) +assert(#{nil, nil} == 0) +assert(#{nil, nil, nil} == 0) +assert(#{nil, nil, nil, nil} == 0) +print'+' + + +local nofind = {} + +a,b,c = 1,2,3 +a,b,c = nil + + +-- next uses always the same iteraction function +assert(next{} == next{}) + +local function find (name) + local n,v + while 1 do + n,v = next(_G, n) + if not n then return nofind end + assert(v ~= nil) + if n == name then return v end + end +end + +local function find1 (name) + for n,v in pairs(_G) do + if n==name then return v end + end + return nil -- not found +end + + +assert(print==find("print") and print == find1("print")) +assert(_G["print"]==find("print")) +assert(assert==find1("assert")) +assert(nofind==find("return")) +assert(not find1("return")) +_G["ret" .. "urn"] = nil +assert(nofind==find("return")) +_G["xxx"] = 1 +assert(xxx==find("xxx")) + +print('+') + +a = {} +for i=0,10000 do + if math.fmod(i,10) ~= 0 then + a['x'..i] = i + end +end + +n = {n=0} +for i,v in pairs(a) do + n.n = n.n+1 + assert(i and v and a[i] == v) +end +assert(n.n == 9000) +a = nil + +do -- clear global table + local a = {} + for n,v in pairs(_G) do a[n]=v end + for n,v in pairs(a) do + if not package.loaded[n] and type(v) ~= "function" and + not string.find(n, "^[%u_]") then + _G[n] = nil + end + collectgarbage() + end +end + + +-- + +local function checknext (a) + local b = {} + do local k,v = next(a); while k do b[k] = v; k,v = next(a,k) end end + for k,v in pairs(b) do assert(a[k] == v) end + for k,v in pairs(a) do assert(b[k] == v) end +end + +checknext{1,x=1,y=2,z=3} +checknext{1,2,x=1,y=2,z=3} +checknext{1,2,3,x=1,y=2,z=3} +checknext{1,2,3,4,x=1,y=2,z=3} +checknext{1,2,3,4,5,x=1,y=2,z=3} + +assert(#{} == 0) +assert(#{[-1] = 2} == 0) +assert(#{1,2,3,nil,nil} == 3) +for i=0,40 do + local a = {} + for j=1,i do a[j]=j end + assert(#a == i) +end + +-- 'maxn' is now deprecated, but it is easily defined in Lua +function table.maxn (t) + local max = 0 + for k in pairs(t) do + max = (type(k) == 'number') and math.max(max, k) or max + end + return max +end + +assert(table.maxn{} == 0) +assert(table.maxn{["1000"] = true} == 0) +assert(table.maxn{["1000"] = true, [24.5] = 3} == 24.5) +assert(table.maxn{[1000] = true} == 1000) +assert(table.maxn{[10] = true, [100*math.pi] = print} == 100*math.pi) + +table.maxn = nil + +-- int overflow +a = {} +for i=0,50 do a[math.pow(2,i)] = true end +assert(a[#a]) + +print('+') + + +-- erasing values +local t = {[{1}] = 1, [{2}] = 2, [string.rep("x ", 4)] = 3, + [100.3] = 4, [4] = 5} + +local n = 0 +for k, v in pairs( t ) do + n = n+1 + assert(t[k] == v) + t[k] = nil + collectgarbage() + assert(t[k] == nil) +end +assert(n == 5) + + +local function test (a) + table.insert(a, 10); table.insert(a, 2, 20); + table.insert(a, 1, -1); table.insert(a, 40); + table.insert(a, #a+1, 50) + table.insert(a, 2, -2) + assert(table.remove(a,1) == -1) + assert(table.remove(a,1) == -2) + assert(table.remove(a,1) == 10) + assert(table.remove(a,1) == 20) + assert(table.remove(a,1) == 40) + assert(table.remove(a,1) == 50) + assert(table.remove(a,1) == nil) +end + +a = {n=0, [-7] = "ban"} +test(a) +assert(a.n == 0 and a[-7] == "ban") + +a = {[-7] = "ban"}; +test(a) +assert(a.n == nil and #a == 0 and a[-7] == "ban") + + +table.insert(a, 1, 10); table.insert(a, 1, 20); table.insert(a, 1, -1) +assert(table.remove(a) == 10) +assert(table.remove(a) == 20) +assert(table.remove(a) == -1) + +a = {'c', 'd'} +table.insert(a, 3, 'a') +table.insert(a, 'b') +assert(table.remove(a, 1) == 'c') +assert(table.remove(a, 1) == 'd') +assert(table.remove(a, 1) == 'a') +assert(table.remove(a, 1) == 'b') +assert(#a == 0 and a.n == nil) + +a = {10,20,30,40} +assert(table.remove(a, #a + 1) == nil and table.remove(a, 0) == nil) +assert(a[#a] == 40) +assert(table.remove(a, #a) == 40) +assert(a[#a] == 30) +assert(table.remove(a, 2) == 20) +assert(a[#a] == 30 and #a == 2) +print('+') + +a = {} +for i=1,1000 do + a[i] = i; a[i-1] = nil +end +assert(next(a,nil) == 1000 and next(a,1000) == nil) + +assert(next({}) == nil) +assert(next({}, nil) == nil) + +for a,b in pairs{} do error"not here" end +for i=1,0 do error'not here' end +for i=0,1,-1 do error'not here' end +a = nil; for i=1,1 do assert(not a); a=1 end; assert(a) +a = nil; for i=1,1,-1 do assert(not a); a=1 end; assert(a) + +if not _port then + print("testing precision in numeric for") + local a = 0; for i=0, 1, 0.1 do a=a+1 end; assert(a==11) + a = 0; for i=0, 0.999999999, 0.1 do a=a+1 end; assert(a==10) + a = 0; for i=1, 1, 1 do a=a+1 end; assert(a==1) + a = 0; for i=1e10, 1e10, -1 do a=a+1 end; assert(a==1) + a = 0; for i=1, 0.99999, 1 do a=a+1 end; assert(a==0) + a = 0; for i=99999, 1e5, -1 do a=a+1 end; assert(a==0) + a = 0; for i=1, 0.99999, -1 do a=a+1 end; assert(a==1) +end + +-- conversion +a = 0; for i="10","1","-2" do a=a+1 end; assert(a==5) + + +collectgarbage() + + +-- testing generic 'for' + +local function f (n, p) + local t = {}; for i=1,p do t[i] = i*10 end + return function (_,n) + if n > 0 then + n = n-1 + return n, table.unpack(t) + end + end, nil, n +end + +local x = 0 +for n,a,b,c,d in f(5,3) do + x = x+1 + assert(a == 10 and b == 20 and c == 30 and d == nil) +end +assert(x == 5) + + + +-- testing __pairs and __ipairs metamethod +a = {} +do + local x,y,z = pairs(a) + assert(type(x) == 'function' and y == a and z == nil) +end + +local function foo (e,i) + assert(e == a) + if i <= 10 then return i+1, i+2 end +end + +local function foo1 (e,i) + i = i + 1 + assert(e == a) + if i <= e.n then return i,a[i] end +end + +setmetatable(a, {__pairs = function (x) return foo, x, 0 end}) + +local i = 0 +for k,v in pairs(a) do + i = i + 1 + assert(k == i and v == k+1) +end + +a.n = 5 +a[3] = 30 + +a = {n=10} +setmetatable(a, {__len = function (x) return x.n end, + __ipairs = function (x) return function (e,i) + if i < #e then return i+1 end + end, x, 0 end}) +i = 0 +for k,v in ipairs(a) do + i = i + 1 + assert(k == i and v == nil) +end +assert(i == a.n) + +print"OK" diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/pm.lc b/luaj-test/src/test/resources/lua5.2.1-tests/pm.lc new file mode 100644 index 0000000000000000000000000000000000000000..336d94cebeb214ae213c802aa06953baae4690b6 GIT binary patch literal 25824 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 d$#>@A8#pvJsrKU7-Rj3*f2n%l?(*N9{2vG^W4! 'alo\0alo\0') +assert('alo' < 'alo\0') +assert('alo\0' > 'alo') +assert('\0' < '\1') +assert('\0\0' < '\0\1') +assert('\1\0a\0a' <= '\1\0a\0a') +assert(not ('\1\0a\0b' <= '\1\0a\0a')) +assert('\0\0\0' < '\0\0\0\0') +assert(not('\0\0\0\0' < '\0\0\0')) +assert('\0\0\0' <= '\0\0\0\0') +assert(not('\0\0\0\0' <= '\0\0\0')) +assert('\0\0\0' <= '\0\0\0') +assert('\0\0\0' >= '\0\0\0') +assert(not ('\0\0b' < '\0\0a\0')) +print('+') + +assert(string.sub("123456789",2,4) == "234") +assert(string.sub("123456789",7) == "789") +assert(string.sub("123456789",7,6) == "") +assert(string.sub("123456789",7,7) == "7") +assert(string.sub("123456789",0,0) == "") +assert(string.sub("123456789",-10,10) == "123456789") +assert(string.sub("123456789",1,9) == "123456789") +assert(string.sub("123456789",-10,-20) == "") +assert(string.sub("123456789",-1) == "9") +assert(string.sub("123456789",-4) == "6789") +assert(string.sub("123456789",-6, -4) == "456") +if not _no32 then + assert(string.sub("123456789",-2^31, -4) == "123456") + assert(string.sub("123456789",-2^31, 2^31 - 1) == "123456789") + assert(string.sub("123456789",-2^31, -2^31) == "") +end +assert(string.sub("\000123456789",3,5) == "234") +assert(("\000123456789"):sub(8) == "789") +print('+') + +assert(string.find("123456789", "345") == 3) +a,b = string.find("123456789", "345") +assert(string.sub("123456789", a, b) == "345") +assert(string.find("1234567890123456789", "345", 3) == 3) +assert(string.find("1234567890123456789", "345", 4) == 13) +assert(string.find("1234567890123456789", "346", 4) == nil) +assert(string.find("1234567890123456789", ".45", -9) == 13) +assert(string.find("abcdefg", "\0", 5, 1) == nil) +assert(string.find("", "") == 1) +assert(string.find("", "", 1) == 1) +assert(not string.find("", "", 2)) +assert(string.find('', 'aaa', 1) == nil) +assert(('alo(.)alo'):find('(.)', 1, 1) == 4) +print('+') + +assert(string.len("") == 0) +assert(string.len("\0\0\0") == 3) +assert(string.len("1234567890") == 10) + +assert(#"" == 0) +assert(#"\0\0\0" == 3) +assert(#"1234567890" == 10) + +assert(string.byte("a") == 97) +assert(string.byte("\xe4") > 127) +assert(string.byte(string.char(255)) == 255) +assert(string.byte(string.char(0)) == 0) +assert(string.byte("\0") == 0) +assert(string.byte("\0\0alo\0x", -1) == string.byte('x')) +assert(string.byte("ba", 2) == 97) +assert(string.byte("\n\n", 2, -1) == 10) +assert(string.byte("\n\n", 2, 2) == 10) +assert(string.byte("") == nil) +assert(string.byte("hi", -3) == nil) +assert(string.byte("hi", 3) == nil) +assert(string.byte("hi", 9, 10) == nil) +assert(string.byte("hi", 2, 1) == nil) +assert(string.char() == "") +assert(string.char(0, 255, 0) == "\0\255\0") +assert(string.char(0, string.byte("\xe4"), 0) == "\0\xe4\0") +assert(string.char(string.byte("\xe4l\0óu", 1, -1)) == "\xe4l\0óu") +assert(string.char(string.byte("\xe4l\0óu", 1, 0)) == "") +assert(string.char(string.byte("\xe4l\0óu", -10, 100)) == "\xe4l\0óu") +print('+') + +assert(string.upper("ab\0c") == "AB\0C") +assert(string.lower("\0ABCc%$") == "\0abcc%$") +assert(string.rep('teste', 0) == '') +assert(string.rep('tés\00tê', 2) == 'tés\0têtés\000tê') +assert(string.rep('', 10) == '') + +-- repetitions with separator +assert(string.rep('teste', 0, 'xuxu') == '') +assert(string.rep('teste', 1, 'xuxu') == 'teste') +assert(string.rep('\1\0\1', 2, '\0\0') == '\1\0\1\0\0\1\0\1') +assert(string.rep('', 10, '.') == string.rep('.', 9)) +if not _no32 then + assert(not pcall(string.rep, "aa", 2^30)) + assert(not pcall(string.rep, "", 2^30, "aa")) +end + +assert(string.reverse"" == "") +assert(string.reverse"\0\1\2\3" == "\3\2\1\0") +assert(string.reverse"\0001234" == "4321\0") + +for i=0,30 do assert(string.len(string.rep('a', i)) == i) end + +assert(type(tostring(nil)) == 'string') +assert(type(tostring(12)) == 'string') +assert(''..12 == '12' and type(12 .. '') == 'string') +assert(string.find(tostring{}, 'table:')) +assert(string.find(tostring(print), 'function:')) +assert(tostring(1234567890123) == '1234567890123') +assert(#tostring('\0') == 1) +assert(tostring(true) == "true") +assert(tostring(false) == "false") +print('+') + +x = '"ílo"\n\\' +assert(string.format('%q%s', x, x) == '"\\"ílo\\"\\\n\\\\""ílo"\n\\') +assert(string.format('%q', "\0") == [["\0"]]) +assert(load(string.format('return %q', x))() == x) +x = "\0\1\0023\5\0009" +assert(load(string.format('return %q', x))() == x) +assert(string.format("\0%c\0%c%x\0", string.byte("\xe4"), string.byte("b"), 140) == + "\0\xe4\0b8c\0") +assert(string.format('') == "") +assert(string.format("%c",34)..string.format("%c",48)..string.format("%c",90)..string.format("%c",100) == + string.format("%c%c%c%c", 34, 48, 90, 100)) +assert(string.format("%s\0 is not \0%s", 'not be', 'be') == 'not be\0 is not \0be') +assert(string.format("%%%d %010d", 10, 23) == "%10 0000000023") +assert(tonumber(string.format("%f", 10.3)) == 10.3) +x = string.format('"%-50s"', 'a') +assert(#x == 52) +assert(string.sub(x, 1, 4) == '"a ') + +assert(string.format("-%.20s.20s", string.rep("%", 2000)) == + "-"..string.rep("%", 20)..".20s") +assert(string.format('"-%20s.20s"', string.rep("%", 2000)) == + string.format("%q", "-"..string.rep("%", 2000)..".20s")) + +-- format x tostring +assert(string.format("%s %s", nil, true) == "nil true") +assert(string.format("%s %.4s", false, true) == "false true") +assert(string.format("%.3s %.3s", false, true) == "fal tru") +local m = setmetatable({}, {__tostring = function () return "hello" end}) +assert(string.format("%s %.10s", m, m) == "hello hello") + + +assert(string.format("%x", 0.3) == "0") +assert(string.format("%02x", 0.1) == "00") +assert(string.format("%08X", 2^32 - 1) == "FFFFFFFF") +assert(string.format("%+08d", 2^31 - 1) == "+2147483647") +assert(string.format("%+08d", -2^31) == "-2147483648") + + +-- longest number that can be formated +assert(string.len(string.format('%99.99f', -1e308)) >= 100) + + + +if not _nolonglong then + print("testing large numbers for format") + assert(string.format("%8x", 2^52 - 1) == "fffffffffffff") + assert(string.format("%d", -1) == "-1") + assert(tonumber(string.format("%u", 2^62)) == 2^62) + assert(string.format("%8x", 0xffffffff) == "ffffffff") + assert(string.format("%8x", 0x7fffffff) == "7fffffff") + assert(string.format("%d", 2^53) == "9007199254740992") + assert(string.format("%d", -2^53) == "-9007199254740992") + assert(string.format("0x%8X", 0x8f000003) == "0x8F000003") + -- maximum integer that fits both in 64-int and (exact) double + local x = 2^64 - 2^(64-53) + assert(x == 0xfffffffffffff800) + assert(tonumber(string.format("%u", x)) == x) + assert(tonumber(string.format("0X%x", x)) == x) + assert(string.format("%x", x) == "fffffffffffff800") + assert(string.format("%d", x/2) == "9223372036854774784") + assert(string.format("%d", -x/2) == "-9223372036854774784") + assert(string.format("%d", -2^63) == "-9223372036854775808") + assert(string.format("%x", 2^63) == "8000000000000000") +end + +if not _noformatA then + print("testing 'format %a %A'") + assert(string.format("%.2a", 0.5) == "0x1.00p-1") + assert(string.format("%A", 0x1fffffffffffff) == "0X1.FFFFFFFFFFFFFP+52") + assert(string.format("%.4a", -3) == "-0x1.8000p+1") + assert(tonumber(string.format("%a", -0.1)) == -0.1) +end + +-- errors in format + +local function check (fmt, msg) + local s, err = pcall(string.format, fmt, 10) + assert(not s and string.find(err, msg)) +end + +local aux = string.rep('0', 600) +check("%100.3d", "too long") +check("%1"..aux..".3d", "too long") +check("%1.100d", "too long") +check("%10.1"..aux.."004d", "too long") +check("%t", "invalid option") +check("%"..aux.."d", "repeated flags") +check("%d %d", "no value") + + +-- integers out of range +assert(not pcall(string.format, "%d", 2^63)) +assert(not pcall(string.format, "%x", 2^64)) +assert(not pcall(string.format, "%x", -2^64)) +assert(not pcall(string.format, "%x", -1)) + + +assert(load("return 1\n--comentário sem EOL no final")() == 1) + + +assert(table.concat{} == "") +assert(table.concat({}, 'x') == "") +assert(table.concat({'\0', '\0\1', '\0\1\2'}, '.\0.') == "\0.\0.\0\1.\0.\0\1\2") +local a = {}; for i=1,3000 do a[i] = "xuxu" end +assert(table.concat(a, "123").."123" == string.rep("xuxu123", 3000)) +assert(table.concat(a, "b", 20, 20) == "xuxu") +assert(table.concat(a, "", 20, 21) == "xuxuxuxu") +assert(table.concat(a, "x", 22, 21) == "") +assert(table.concat(a, "3", 2999) == "xuxu3xuxu") +if not _no32 then + assert(table.concat({}, "x", 2^31-1, 2^31-2) == "") + assert(table.concat({}, "x", -2^31+1, -2^31) == "") + assert(table.concat({}, "x", 2^31-1, -2^31) == "") + assert(table.concat({[2^31-1] = "alo"}, "x", 2^31-1, 2^31-1) == "alo") +end + +assert(not pcall(table.concat, {"a", "b", {}})) + +a = {"a","b","c"} +assert(table.concat(a, ",", 1, 0) == "") +assert(table.concat(a, ",", 1, 1) == "a") +assert(table.concat(a, ",", 1, 2) == "a,b") +assert(table.concat(a, ",", 2) == "b,c") +assert(table.concat(a, ",", 3) == "c") +assert(table.concat(a, ",", 4) == "") + +if not _port then + +local locales = { "ptb", "ISO-8859-1", "pt_BR" } +local function trylocale (w) + for i = 1, #locales do + if os.setlocale(locales[i], w) then return true end + end + return false +end + +if not trylocale("collate") then + print("locale not supported") +else + assert("alo" < "álo" and "álo" < "amo") +end + +if not trylocale("ctype") then + print("locale not supported") +else + assert(load("a = 3.4")); -- parser should not change outside locale + assert(not load("á = 3.4")); -- even with errors + assert(string.gsub("áéíóú", "%a", "x") == "xxxxx") + assert(string.gsub("áÁéÉ", "%l", "x") == "xÁxÉ") + assert(string.gsub("áÁéÉ", "%u", "x") == "áxéx") + assert(string.upper"áÁé{xuxu}ção" == "ÁÁÉ{XUXU}ÇÃO") +end + +os.setlocale("C") +assert(os.setlocale() == 'C') +assert(os.setlocale(nil, "numeric") == 'C') + +end + +print('OK') + + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/vararg.lc b/luaj-test/src/test/resources/lua5.2.1-tests/vararg.lc new file mode 100644 index 0000000000000000000000000000000000000000..e2c7b378e177b098ee8cab6426a10d4b12e10a2f GIT binary patch literal 7541 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 literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/verybig.lua b/luaj-test/src/test/resources/lua5.2.1-tests/verybig.lua new file mode 100644 index 00000000..69007482 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/verybig.lua @@ -0,0 +1,144 @@ +print "testing RK" + +-- testing opcodes with RK arguments larger than K limit +local function foo () + local dummy = { + -- fill first 256 entries in table of constants + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, + } + assert(24.5 + 0.6 == 25.1) + local t = {foo = function (self, x) return x + self.x end, x = 10} + t.t = t + assert(t:foo(1.5) == 11.5) + assert(t.t:foo(0.5) == 10.5) -- bug in 5.2 alpha + assert(24.3 == 24.3) + assert((function () return t.x end)() == 10) +end + + +foo() +foo = nil + +if _soft then return 10 end + +print "testing large programs (>64k)" + +-- template to create a very big test file +prog = [[$ + +local a,b + +b = {$1$ + b30009 = 65534, + b30010 = 65535, + b30011 = 65536, + b30012 = 65537, + b30013 = 16777214, + b30014 = 16777215, + b30015 = 16777216, + b30016 = 16777217, + b30017 = 4294967294, + b30018 = 4294967295, + b30019 = 4294967296, + b30020 = 4294967297, + b30021 = -65534, + b30022 = -65535, + b30023 = -65536, + b30024 = -4294967297, + b30025 = 15012.5, + $2$ +}; + +assert(b.a50008 == 25004 and b["a11"] == 5.5) +assert(b.a33007 == 16503.5 and b.a50009 == 25004.5) +assert(b["b"..30024] == -4294967297) + +function b:xxx (a,b) return a+b end +assert(b:xxx(10, 12) == 22) -- pushself with non-constant index +b.xxx = nil + +s = 0; n=0 +for a,b in pairs(b) do s=s+b; n=n+1 end +assert(s==13977183656.5 and n==70001) + + +a = nil; b = nil +print'+' + +function f(x) b=x end + +a = f{$3$} or 10 + +assert(a==10) +assert(b[1] == "a10" and b[2] == 5 and b[#b-1] == "a50009") + + +function xxxx (x) return b[x] end + +assert(xxxx(3) == "a11") + +a = nil; b=nil +xxxx = nil + +return 10 + +]] + +-- functions to fill in the $n$ +F = { +function () -- $1$ + for i=10,50009 do + io.write('a', i, ' = ', 5+((i-10)/2), ',\n') + end +end, + +function () -- $2$ + for i=30026,50009 do + io.write('b', i, ' = ', 15013+((i-30026)/2), ',\n') + end +end, + +function () -- $3$ + for i=10,50009 do + io.write('"a', i, '", ', 5+((i-10)/2), ',\n') + end +end, +} + +file = os.tmpname() +io.output(file) +for s in string.gmatch(prog, "$([^$]+)") do + local n = tonumber(s) + if not n then io.write(s) else F[n]() end +end +io.close() +result = dofile(file) +assert(os.remove(file)) +print'OK' +return result + diff --git a/luaj-test/src/test/resources/luaj3.0-tests/baselib.lua b/luaj-test/src/test/resources/luaj3.0-tests/baselib.lua new file mode 100644 index 00000000..96c50ce8 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/baselib.lua @@ -0,0 +1,277 @@ + +-- tostring replacement that assigns ids +local ts,id,nid,types = tostring,{},0,{table='tbl',thread='thr',userdata='uda',['function']='func'} +tostring = function(x) + if not x or not types[type(x)] then return ts(x) end + if not id[x] then nid=nid+1; id[x]=types[type(x)]..'.'..nid end + return id[x] +end + +-- wrap pcall to return one result +-- error message are tested elsewhere +local pc = pcall +local pcall = function(...) + local s,e = pc(...) + if s then return e end + return false, type(e) +end + +-- print +print() +print(11) +print("abc",123,nil,"pqr") +print( nil and 'T' or 'F' ) +print( false and 'T' or 'F' ) +print( 0 and 'T' or 'F' ) + +-- assert +print( 'assert(true)', assert(true) ) +print( 'pcall(assert,true)', pcall(assert,true) ) +print( 'pcall(assert,false)', pcall(assert,false) ) +print( 'pcall(assert,nil)', pcall(assert,nil) ) +print( 'pcall(assert,true,"msg")', pcall(assert,true,"msg") ) +print( 'pcall(assert,false,"msg")', pcall(assert,false,"msg") ) +print( 'pcall(assert,nil,"msg")', pcall(assert,nil,"msg") ) +print( 'pcall(assert,false,"msg","msg2")', pcall(assert,false,"msg","msg2") ) + +-- collectgarbage (not supported) +print( 'collectgarbage("count")', type(collectgarbage("count"))) +print( 'collectgarbage("collect")', type(collectgarbage("collect"))) +print( 'collectgarbage("count")', type(collectgarbage("count"))) + +-- dofile (not supported) +-- ipairs +print( 'pcall(ipairs)', pcall(ipairs) ) +print( 'pcall(ipairs,nil)', pcall(ipairs,nil) ) +print( 'pcall(ipairs,"a")', pcall(ipairs,"a") ) +print( 'pcall(ipairs,1)', pcall(ipairs,1) ) +for k,v in ipairs({}) do print('ipairs1',k,v)end +for k,v in ipairs({'one','two'}) do print('ipairs2',k,v)end +for k,v in ipairs({aa='aaa',bb='bbb'}) do print('ipairs3',k,v)end +for k,v in ipairs({aa='aaa',bb='bbb','one','two'}) do print('ipairs4',k,v)end +for k,v in ipairs({[30]='30',[20]='20'}) do print('ipairs5',k,v)end + +-- load +t = { "print ", "'table ", "loaded'", "", " print'after empty string'" } +i = 0 +f = function() i = i + 1; return t[i]; end +c,e = load(f) +if c then print('load: ', pcall(c)) else print('load failed:', e) end + +-- loadfile +-- load +local lst = "print(3+4); return 8" +local chunk, err = load( lst ) +print( 'load("'..lst..'")', chunk, err ) +print( 'load("'..lst..'")()', chunk() ) + +-- pairs +print( 'pcall(pairs)', pcall(pairs) ) +print( 'pcall(pairs,nil)', pcall(pairs,nil) ) +print( 'pcall(pairs,"a")', pcall(pairs,"a") ) +print( 'pcall(pairs,1)', pcall(pairs,1) ) +for k,v in pairs({}) do print('pairs1',k,v)end +for k,v in pairs({'one','two'}) do print('pairs2',k,v)end +for k,v in pairs({aa='aaa'}) do print('pairs3',k,v)end +for k,v in pairs({aa='aaa','one','two'}) do print('pairs4',k,v)end +for k,v in pairs({[20]='30',[30]='20'}) do print('pairs5',k,v)end + +-- _G +print( '_G["abc"] (before)', _G["abc"] ) +abc='def' +print( '_G["abc"] (after)', _G["abc"] ) + +-- type +print( 'type(nil)', type(nil) ) +print( 'type("a")', type("a") ) +print( 'type(1)', type(1) ) +print( 'type(1.5)', type(1.5) ) +print( 'type(function() end)', type(function() end) ) +print( 'type({})', type({}) ) +print( 'type(true)', type(true) ) +print( 'type(false)', type(false) ) +print( 'pcall(type,type)', pcall(type,type) ) +print( 'pcall(type)', pcall(type) ) +print( '(function() return pcall(type) end)()', (function() return pcall(type) end)() ) +local function la() return pcall(type) end +print( 'la()', la() ) +function ga() return pcall(type) end +print( 'ga()', ga() ) + +-- getmetatable, setmetatable +ta = { aa1="aaa1", aa2="aaa2" } +tb = { bb1="bbb1", bb2="bbb2" } +print( 'getmetatable(ta)', getmetatable(ta) ) +print( 'getmetatable(tb)', getmetatable(tb) ) +print( 'setmetatable(ta),{cc1="ccc1"}', type( setmetatable(ta,{cc1="ccc1"}) ) ) +print( 'setmetatable(tb),{dd1="ddd1"}', type( setmetatable(tb,{dd1="ddd1"}) ) ) +print( 'getmetatable(ta)["cc1"]', getmetatable(ta)["cc1"] ) +print( 'getmetatable(tb)["dd1"]', getmetatable(tb)["dd1"] ) +print( 'getmetatable(1)', getmetatable(1) ) +print( 'pcall(setmetatable,1)', pcall(setmetatable,1) ) +print( 'pcall(setmetatable,nil)', pcall(setmetatable,nil) ) +print( 'pcall(setmetatable,"ABC")', pcall(setmetatable,"ABC") ) +print( 'pcall(setmetatable,function() end)', pcall(setmetatable,function() end) ) + +-- rawget,rawset +local mt = {aa="aaa", bb="bbb"} +mt.__index = mt +mt.__newindex = mt +local s = {cc="ccc", dd="ddd", } +local t = {cc="ccc", dd="ddd"} +setmetatable(t,mt) +print( 'pcall(rawget)', pcall(rawget)) +print( 'pcall(rawget,"a")', pcall(rawget,"a")) +print( 'pcall(rawget,s)', pcall(rawget,s)) +print( 'pcall(rawget,t)', pcall(rawget,t)) + +function printtables() + function printtable(name,t) + print( ' '..name, t["aa"], t["bb"], t["cc"], t["dd"], t["ee"], t["ff"], t["gg"] ) + print( ' '..name, + rawget(t,"aa"), + rawget(t,"bb"), + rawget(t,"cc"), + rawget(t,"dd"), + rawget(t,"ee"), + rawget(t,"ff"), + rawget(t,"gg") ) + end + printtable( 's', s ) + printtable( 't', t ) + printtable( 'mt', mt ) +end +printtables() +print( 'pcall(rawset,s,"aa","www")', rawset(s,"aa","www")) +printtables() +print( 'pcall(rawset,s,"cc","xxx")', rawset(s,"cc","xxx")) +printtables() +print( 'pcall(rawset,t,"aa","yyy")', rawset(t,"aa","yyy")) +printtables() +print( 'pcall(rawset,t,"dd","zzz")', rawset(t,"dd","zzz")) +printtables() + +-- rawlen +print( 'pcall(rawlen, {})', pcall(rawlen, {})) +print( 'pcall(rawlen, {"a"})', pcall(rawlen, {'a'})) +print( 'pcall(rawlen, {"a","b"})', pcall(rawlen, {'a','b'})) +print( 'pcall(rawlen, "")', pcall(rawlen, "")) +print( 'pcall(rawlen, "a")', pcall(rawlen, 'a')) +print( 'pcall(rawlen, "ab")', pcall(rawlen, 'ab')) +print( 'pcall(rawlen, 1)', pcall(rawlen, 1)) +print( 'pcall(rawlen, nil)', pcall(rawlen, nil)) +print( 'pcall(rawlen)', pcall(rawlen)) + +printtables() +print( 's["ee"]="ppp"' ); s["ee"]="ppp" +printtables() +print( 's["cc"]="qqq"' ); s["cc"]="qqq" +printtables() +print( 't["ff"]="rrr"' ); t["ff"]="rrr" +printtables() +print( 't["dd"]="sss"' ); t["dd"]="sss" +printtables() +print( 'mt["gg"]="ttt"' ); mt["gg"]="ttt" +printtables() + + +-- select +print( 'pcall(select)', pcall(select) ) +print( 'select(1,11,22,33,44,55)', select(1,11,22,33,44,55) ) +print( 'select(2,11,22,33,44,55)', select(2,11,22,33,44,55) ) +print( 'select(3,11,22,33,44,55)', select(3,11,22,33,44,55) ) +print( 'select(4,11,22,33,44,55)', select(4,11,22,33,44,55) ) +print( 'pcall(select,5,11,22,33,44,55)', pcall(select,5,11,22,33,44,55) ) +print( 'pcall(select,6,11,22,33,44,55)', pcall(select,6,11,22,33,44,55) ) +print( 'pcall(select,7,11,22,33,44,55)', pcall(select,7,11,22,33,44,55) ) +print( 'pcall(select,0,11,22,33,44,55)', pcall(select,0,11,22,33,44,55) ) +print( 'pcall(select,-1,11,22,33,44,55)', pcall(select,-1,11,22,33,44,55) ) +print( 'pcall(select,-2,11,22,33,44,55)', pcall(select,-2,11,22,33,44,55) ) +print( 'pcall(select,-4,11,22,33,44,55)', pcall(select,-4,11,22,33,44,55) ) +print( 'pcall(select,-5,11,22,33,44,55)', pcall(select,-5,11,22,33,44,55) ) +print( 'pcall(select,-6,11,22,33,44,55)', pcall(select,-6,11,22,33,44,55) ) +print( 'pcall(select,1)', pcall(select,1) ) +print( 'pcall(select,select)', pcall(select,select) ) +print( 'pcall(select,{})', pcall(select,{}) ) +print( 'pcall(select,"2",11,22,33)', pcall(select,"2",11,22,33) ) +print( 'pcall(select,"abc",11,22,33)', pcall(select,"abc",11,22,33) ) + + +-- tonumber +print( 'pcall(tonumber)', pcall(tostring) ) +print( 'pcall(tonumber,nil)', pcall(tonumber,nil) ) +print( 'pcall(tonumber,"abc")', pcall(tonumber,"abc") ) +print( 'pcall(tonumber,"123")', pcall(tonumber,"123") ) +print( 'pcall(tonumber,"123",10)', pcall(tonumber,"123", 10) ) +print( 'pcall(tonumber,"123",8)', pcall(tonumber,"123", 8) ) +print( 'pcall(tonumber,"123",6)', pcall(tonumber,"123", 6) ) +print( 'pcall(tonumber,"10101",4)', pcall(tonumber,"10101", 4) ) +print( 'pcall(tonumber,"10101",3)', pcall(tonumber,"10101", 3) ) +print( 'pcall(tonumber,"10101",2)', pcall(tonumber,"10101", 2) ) +print( 'pcall(tonumber,"1a1",16)', pcall(tonumber,"1a1", 16) ) +print( 'pcall(tonumber,"1a1",32)', pcall(tonumber,"1a1", 32) ) +print( 'pcall(tonumber,"1a1",54)', pcall(tonumber,"1a1", 54) ) +print( 'pcall(tonumber,"1a1",1)', pcall(tonumber,"1a1", 1) ) +print( 'pcall(tonumber,"1a1",0)', pcall(tonumber,"1a1", 0) ) +print( 'pcall(tonumber,"1a1",-1)', pcall(tonumber,"1a1", -1) ) +print( 'pcall(tonumber,"1a1","32")', pcall(tonumber,"1a1", "32") ) +print( 'pcall(tonumber,"123","456")', pcall(tonumber,"123","456") ) +print( 'pcall(tonumber,"1a1",10)', pcall(tonumber,"1a1", 10) ) +print( 'pcall(tonumber,"151",4)', pcall(tonumber,"151", 4) ) +print( 'pcall(tonumber,"151",3)', pcall(tonumber,"151", 3) ) +print( 'pcall(tonumber,"151",2)', pcall(tonumber,"151", 2) ) +print( 'pcall(tonumber,"123",8,8)', pcall(tonumber,"123", 8, 8) ) +print( 'pcall(tonumber,123)', pcall(tonumber,123) ) +print( 'pcall(tonumber,true)', pcall(tonumber,true) ) +print( 'pcall(tonumber,false)', pcall(tonumber,false) ) +print( 'pcall(tonumber,tonumber)', pcall(tonumber,tonumber) ) +print( 'pcall(tonumber,function() end)', pcall(tonumber,function() end) ) +print( 'pcall(tonumber,{"one","two",a="aa",b="bb"})', pcall(tonumber,{"one","two",a="aa",b="bb"}) ) +print( 'pcall(tonumber,"123.456")', pcall(tonumber,"123.456") ) +print( 'pcall(tonumber," 123.456")', pcall(tonumber," 123.456") ) +print( 'pcall(tonumber," 234qwer")', pcall(tonumber," 234qwer") ) +print( 'pcall(tonumber,"0x20")', pcall(tonumber,"0x20") ) +print( 'pcall(tonumber," 0x20")', pcall(tonumber," 0x20") ) +print( 'pcall(tonumber,"0x20 ")', pcall(tonumber,"0x20 ") ) +print( 'pcall(tonumber," 0x20 ")', pcall(tonumber," 0x20 ") ) +print( 'pcall(tonumber,"0X20")', pcall(tonumber,"0X20") ) +print( 'pcall(tonumber," 0X20")', pcall(tonumber," 0X20") ) +print( 'pcall(tonumber,"0X20 ")', pcall(tonumber,"0X20 ") ) +print( 'pcall(tonumber," 0X20 ")', pcall(tonumber," 0X20 ") ) +print( 'pcall(tonumber,"0x20",10)', pcall(tonumber,"0x20",10) ) +print( 'pcall(tonumber,"0x20",16)', pcall(tonumber,"0x20",16) ) +print( 'pcall(tonumber,"0x20",8)', pcall(tonumber,"0x20",8) ) + +-- tostring +print( 'pcall(tostring)', pcall(tostring) ) +print( 'pcall(tostring,nil)', pcall(tostring,nil) ) +print( 'pcall(tostring,"abc")', pcall(tostring,"abc") ) +print( 'pcall(tostring,"abc","def")', pcall(tostring,"abc","def") ) +print( 'pcall(tostring,123)', pcall(tostring,123) ) +print( 'pcall(tostring,true)', pcall(tostring,true) ) +print( 'pcall(tostring,false)', pcall(tostring,false) ) +print( 'tostring(tostring)', type(tostring(tostring)) ) +print( 'tostring(function() end)', type(tostring(function() end)) ) +print( 'tostring({"one","two",a="aa",b="bb"})', type(tostring({"one","two",a="aa",b="bb"})) ) + +-- _VERSION +print( '_VERSION', type(_VERSION) ) + +-- xpcall +local errfunc = function( detail ) + print( ' in errfunc', type(detail) ) + return 'response-from-xpcall' +end +local badfunc = function() error( 'error-from-badfunc' ) end +local wrappedbad = function() pcall( badfunc ) end +print( 'pcall(badfunc)', pcall(badfunc) ) +print( 'pcall(badfunc,errfunc)', pcall(badfunc,errfunc) ) +print( 'pcall(badfunc,badfunc)', pcall(badfunc,badfunc) ) +print( 'pcall(wrappedbad)', pcall(wrappedbad) ) +print( 'pcall(wrappedbad,errfunc)', pcall(wrappedbad,errfunc) ) +print( 'pcall(xpcall(badfunc))', pcall(xpcall,badfunc) ) +print( 'pcall(xpcall(badfunc,errfunc))', pcall(xpcall,badfunc,errfunc) ) +print( 'pcall(xpcall(badfunc,badfunc))', pcall(xpcall,badfunc,badfunc) ) +print( 'pcall(xpcall(wrappedbad))', pcall(xpcall,wrappedbad) ) +print( 'xpcall(wrappedbad,errfunc)', xpcall(wrappedbad,errfunc) ) + diff --git a/luaj-test/src/test/resources/luaj3.0-tests/coroutinelib.lua b/luaj-test/src/test/resources/luaj3.0-tests/coroutinelib.lua new file mode 100644 index 00000000..468dc1f7 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/coroutinelib.lua @@ -0,0 +1,126 @@ +function printrunning() + if coroutine.running() == nil then + print("running is nil"); + else + print("running is not nil") + end +end + +function foo (a) + print("foo", a) + return coroutine.yield(2*a) +end + +co = coroutine.create(function (a,b) + print("co-body", a, b) + local r = foo(a+1) + print("co-body", r) + local r, s = coroutine.yield(a+b, a-b) + print("co-body", r, s) + + printrunning() + print("co.status.inside",coroutine.status(co)); + local co2 = coroutine.create(function() + print("co.status.inside2",coroutine.status(co)); + end) + print("co.status.inside",coroutine.status(co)); + coroutine.resume(co2); + + return b, "end" +end) + +function exercise() + printrunning() + print("co.status",coroutine.status(co)); + print("main", coroutine.resume(co, 1, 10)) + print("co.status",coroutine.status(co)); + print("main", coroutine.resume(co, "r")) + print("co.status",coroutine.status(co)); + print("main", coroutine.resume(co, "x", "y")) + print("co.status",coroutine.status(co)); + print("main", coroutine.resume(co, "x", "y")) + print("co.status",coroutine.status(co)); +end + +exercise(); + +co = coroutine.create(function (a,b) + print("co-body", a, b) +-- TODO: make java and C behave the same for yielding in pcalls +-- local status,r = pcall( foo, a+1 ) +foo(a+1) + print("co-body", status,r) + local r, s = coroutine.yield(a+b, a-b) + print("co-body", r, s) + return b, "end" +end) + +exercise(); + + +-- wrap test +local g = coroutine.wrap(function (a,b) + print("co-body", a, b) + local r = foo(a+1) + print("co-body", r) + local r, s = coroutine.yield(a+b, a-b) + print("co-body", r, s) + return b, "end" +end ) + +print("g", g(1, 10)) +print("g", g("r")) +print("g", g("x", "y")) +local s,e = pcall( g, "x", "y" ) +print("g", string.match(e,'cannot resume dead coroutine') or 'badmessage: '..tostring(e)) + +-- varargs passing +local echo = function(msg,...) + print( msg, ...) + return ... +end +local echocr = function(...) + local arg = table.pack(...) + echo('(echocr) first args', table.unpack(arg,1,arg.n)) + local a = arg + while true do + a = { echo( '(echoch) yield returns', coroutine.yield( table.unpack(a) ) ) } + end +end +local c = coroutine.create( echocr ) +local step = function(...) + echo( '(main) resume returns', + coroutine.resume(c, echo('(main) sending args', ...)) ) +end +step(111,222,333) +step() +step(111) +step(111,222,333) + +-- test loops in resume calls +b = coroutine.create( function( arg ) + while ( true ) do + print( ' b-resumed', arg, b == coroutine.running() ) + print( ' b-b', coroutine.status(b) ) + print( ' b-c', coroutine.status(c) ) + print( ' b-resume-b',coroutine.resume( b, 'b-arg-for-b' ) ) + print( ' b-resume-c',coroutine.resume( c, 'b-arg-for-c' ) ) + arg = coroutine.yield( 'b-rslt' ) + end +end ) +c = coroutine.create( function( arg ) + for i=1,3 do + print( ' c-resumed', arg, c == coroutine.running() ) + print( ' c-b', coroutine.status(b) ) + print( ' c-c', coroutine.status(c) ) + print( ' c-resume-b',coroutine.resume( b, 'b-arg-for-b' ) ) + print( ' c-resume-c',coroutine.resume( c, 'b-arg-for-c' ) ) + arg = coroutine.yield( 'c-rslt' ) + end +end ) +for i=1,3 do + print( 'main-b', coroutine.status(b) ) + print( 'main-c', coroutine.status(c) ) + print( 'main-resume-b',coroutine.resume( b, 'main-arg-for-b' ) ) + print( 'main-resume-c',coroutine.resume( c, 'main-arg-for-c' ) ) +end diff --git a/luaj-test/src/test/resources/luaj3.0-tests/debuglib.lua b/luaj-test/src/test/resources/luaj3.0-tests/debuglib.lua new file mode 100644 index 00000000..11894486 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/debuglib.lua @@ -0,0 +1,280 @@ + +local print,tostring,_G,pcall,ipairs,isnumber = print,tostring,_G,pcall,ipairs,isnumber +local e,f,g,h,s +print( 'has debug', debug~=nil ) +if not debug then error( 'no debug' ) end + + +print( '----- debug.getlocal, debug.setlocal' ) +h = function(v,i,n) + s = 'h-'..v..'-'..i + local x1,y1 = debug.getlocal(v,i) + local x2,y2 = debug.setlocal(v,i,n) + local x3,y3 = debug.getlocal(v,i) + return s..' -> '..v..'-'..i..' '.. + 'get='..tostring(x1)..','..tostring(y1)..' '.. + 'set='..tostring(x2)..','..tostring(y2)..' '.. + 'get='..tostring(x3)..','..tostring(y3)..' ' +end +g = function(...) + local p,q,r=7,8,9 + local t = h(...) + local b = table.concat({...},',') + return t..'\tg locals='..p..','..q..','..r..' tbl={'..b..'}' +end +f = function(a,b,c) + local d,e,f = 4,5,6 + local t = g(a,b,c) + return t..'\tf locals='..','..a..','..b..','..c..','..d..','..e..','..f +end +for lvl=3,2,-1 do + for lcl=0,7 do + print( pcall( f, lvl, lcl, '#' ) ) + end +end +for lvl=1,1 do + for lcl=3,7 do + print( pcall( f, lvl, lcl, '#' ) ) + end +end + + +print( '----- debug.getupvalue, debug.setupvalue' ) +local m,n,o = 101,102,103 +f = function(p,q,r) + local p,q,r = 104,105,106 + local g = function(s,t,u) + local v,w,x = 107,108,109 + return function() + return m,n,o,p,q,r,v,w,x + end + end + return g +end +g = f() +h = g() +local callh = function() + local t = {} + for i,v in ipairs( { pcall(h) } ) do + t[i] = tostring(v) + end + return table.concat(t,',') +end +print( 'h', h() ) +local funs = { f, g, h } +local names = { 'f', 'g', 'h' } +for i=1,3 do + local fun,name = funs[i],names[i] + for index=0,10 do + local s1,x1,y1 = pcall( debug.getupvalue, fun, index ) + local s2,x2,y2 = pcall( debug.setupvalue, fun, index, 666000+i*111000+index ) + local s3,x3,y3 = pcall( debug.getupvalue, fun, index ) + print( name..' -> '..i..'-'..index..' '.. + 'get='..tostring(s1)..','..tostring(x1)..','..tostring(y1)..' '.. + 'set='..tostring(s2)..','..tostring(x2)..','..tostring(y2)..' '.. + 'get='..tostring(s3)..','..tostring(x3)..','..tostring(y3)..' '.. + 'tbl='..callh() ) + end +end + +print( '----- debug.setmetatable, debug.getmetatable' ) +local a = {a='bbb'} +local b = {} +local mt = {__index={b='ccc'}} +print( 'a.a='..tostring(a.a)..' a.b='..tostring(a.b)..' b.a='..tostring(b.a)..' b.b='..tostring(b.b)) +local s1,x1,y1 = pcall( debug.getmetatable, a ) +local s2,x2,y2 = pcall( debug.setmetatable, a, mt ) +print( 'a.a='..tostring(a.a)..' a.b='..tostring(a.b)..' b.a='..tostring(b.a)..' b.b='..tostring(b.b)) +local s3,x3,y3 = pcall( debug.getmetatable, a ) print(type(s3), type(x3), type(y3), type(getmetatable(a))) +local s4,x4,y4 = pcall( debug.getmetatable, b ) print(type(s4), type(x4), type(y4), type(getmetatable(b))) +local s5,x5,y5 = pcall( debug.setmetatable, a, nil ) print(type(s5), type(x5), type(y5), type(getmetatable(a))) +print( 'a.a='..tostring(a.a)..' a.b='..tostring(a.b)..' b.a='..tostring(b.a)..' b.b='..tostring(b.b)) +local s6,x6,y6 = pcall( debug.getmetatable, a ) print(type(s6), type(x6), type(y6), type(getmetatable(a))) +if not s1 then print( 's1 error', x1 ) end +if not s2 then print( 's2 error', x2 ) end +if not s3 then print( 's3 error', x3 ) end +if not s4 then print( 's4 error', x4 ) end +if not s5 then print( 's5 error', x5 ) end +if not s6 then print( 's6 error', x6 ) end +print( 'get='..tostring(s1)..','..tostring(x1==nil)..','..tostring(y1) ) +print( 'set='..tostring(s2)..','..tostring(x2==a)..','..tostring(y2) ) +print( 'get='..tostring(s3)..','..tostring(x3==mt)..','..tostring(y3) ) +print( 'get='..tostring(s4)..','..tostring(x4==nil)..','..tostring(y4) ) +print( 'set='..tostring(s5)..','..tostring(x5==a)..','..tostring(y5) ) +print( 'get='..tostring(s6)..','..tostring(x6==nil)..','..tostring(y6) ) +print( pcall( debug.getmetatable, 1 ) ) +print( pcall( debug.setmetatable, 1, {} ) ) +print( pcall( debug.setmetatable, 1, nil ) ) + +print( '----- debug.getinfo' ) +local printfield = function(tbl, field) + local x = tbl[field] + if x == nil then return end + local typ = type(x) + if typ=='table' then + x = '{'..table.concat(x,',')..'}' + elseif typ=='function' then + x = typ + end + print( ' '..field..': '..tostring(x) ) +end +local fields = { 'source', 'short_src', 'what', + 'currentline', 'linedefined', 'lastlinedefined', + 'nups', 'func', 'activelines' } +local printinfo = function(...) + for i,a in ipairs({...}) do + if type(a) == 'table' then + for j,field in ipairs(fields) do + printfield( a, field) + end + else + print( tostring(a) ) + end + end +end +function test() + local x = 5 + function f() + x = x + 1 + return x + end + function g() + x = x - 1 + print( '---' ) + printinfo( 'debug.getinfo(1)', debug.getinfo(1) ) + printinfo( 'debug.getinfo(1,"")', debug.getinfo(1, "") ) + printinfo( 'debug.getinfo(1,"l")', debug.getinfo(1, "l") ) + printinfo( 'debug.getinfo(1,"fL")', debug.getinfo(1, "fL") ) + printinfo( 'debug.getinfo(2)', debug.getinfo(2) ) + printinfo( 'debug.getinfo(2,"l")', debug.getinfo(2, "l") ) + printinfo( 'debug.getinfo(2,"fL")', debug.getinfo(2, "fL") ) + printinfo( 'debug.getinfo(10,"")', pcall( debug.getinfo, 10, "" ) ) + printinfo( 'debug.getinfo(-10,"")', pcall( debug.getinfo, -10, "" ) ) + print( '---' ) + return x + end + print(f()) + print(g()) + return f, g +end + +local options = "nSlufL" +local e,f,g = pcall( test ) +print( 'e,f,g', e, type(f), type(g) ) +printinfo( 'debug.getinfo(f)', pcall(debug.getinfo, f) ) +printinfo( 'debug.getinfo(f,"'..options..'")', pcall(debug.getinfo, f, options) ) +for j=1,6 do + local opts = options:sub(j,j) + printinfo( 'debug.getinfo(f,"'..opts..'")', pcall(debug.getinfo, f, opts) ) +end +printinfo( 'debug.getinfo(g)', pcall(debug.getinfo, g) ) +printinfo( 'debug.getinfo(test)', pcall(debug.getinfo, test) ) + +print( '----- debug.sethook, debug.gethook' ) +f = function(x) + g = function(y) + return math.min(x,h) + end + local a = g(x) + return a + a +end +local hook = function(...) + print( ' ... in hook', ... ) + local info = debug.getinfo(2,"Sl") + if info then + print( ' info[2]='..tostring(info.short_src)..','..tostring(info.currentline) ) + end +end +local tryfunc = function(hook,mask,func,arg) + local x,f,h,m + pcall( function() + debug.sethook(hook,mask) + x = func(arg) + f,h,m = debug.gethook() + end ) + debug.sethook() + return x,f,h,m +end + +local tryhooks = function(mask) + local s1,a1,b1,c1,d1 = pcall( tryfunc, hook, mask, f, 333 ) + print( 'hook = '..mask..' -> '.. + 'result='..tostring(s1)..','..tostring(a1)..','.. + type(b1)..','..type(c1)..','.. + tostring(b1==f)..','..tostring(c1==hook)..','.. + tostring(d1)..' ' ) +end + +tryhooks("c") +tryhooks("r") +tryhooks("l") +tryhooks("crl") + +print( '----- debug.traceback' ) +function test() + function a(msg) + print((string.gsub(debug.traceback(msg), "%[Java]", "[C]"))) + end + local function b(msg) + pcall(a,msg) + end + c = function(i) + if i <= 0 then b('hi') return end + return c(i-1) + end + d = setmetatable({},{__index=function(t,k) v = c(k) return v end}) + local e = function() + return d[0] + end + local f = { + g = function() + e() + end + } + h = function() + f.g() + end + local i = h + i() +end +pcall(test) + + +print( '----- debug.upvalueid' ) +local x,y = 100,200 +function a(b,c) + local z,w = b,c + return function() + x,y,z,w = x+1,y+1,z+1,w+1 + return x,y,z,w + end +end +a1 = a(300,400) +a2 = a(500,600) +print('debug.getupvalue(a1,1)', debug.getupvalue(a1,1)) +print('debug.getupvalue(a1,2)', debug.getupvalue(a1,2)) +print('debug.getupvalue(a2,1)', debug.getupvalue(a2,1)) +print('debug.getupvalue(a2,2)', debug.getupvalue(a2,2)) +print('debug.upvalueid(a1,1) == debug.upvalueid(a1,1)', debug.upvalueid(a1,1) == debug.upvalueid(a1,1)) +print('debug.upvalueid(a1,1) == debug.upvalueid(a2,1)', debug.upvalueid(a1,1) == debug.upvalueid(a2,1)) +print('debug.upvalueid(a1,1) == debug.upvalueid(a1,2)', debug.upvalueid(a1,1) == debug.upvalueid(a1,2)) + +print( '----- debug.upvaluejoin' ) +print('a1',a1()) +print('a2',a2()) +print('debug.upvaluejoin(a1,1,a2,2)', debug.upvaluejoin(a1,1,a2,2)) +print('debug.upvaluejoin(a1,3,a2,4)', debug.upvaluejoin(a1,3,a2,4)) +print('a1',a1()) +print('a2',a2()) +print('a1',a1()) +print('a2',a2()) +for i = 1,4 do + print('debug.getupvalue(a1,'..i..')', debug.getupvalue(a1,i)) + print('debug.getupvalue(a2,'..i..')', debug.getupvalue(a2,i)) + for j = 1,4 do + print('debug.upvalueid(a1,'..i..') == debug.upvalueid(a1,'..j..')', debug.upvalueid(a1,i) == debug.upvalueid(a1,j)) + print('debug.upvalueid(a1,'..i..') == debug.upvalueid(a2,'..j..')', debug.upvalueid(a1,i) == debug.upvalueid(a2,j)) + print('debug.upvalueid(a2,'..i..') == debug.upvalueid(a1,'..j..')', debug.upvalueid(a2,i) == debug.upvalueid(a1,j)) + print('debug.upvalueid(a2,'..i..') == debug.upvalueid(a2,'..j..')', debug.upvalueid(a2,i) == debug.upvalueid(a2,j)) + end +end diff --git a/luaj-test/src/test/resources/luaj3.0-tests/errors.lua b/luaj-test/src/test/resources/luaj3.0-tests/errors.lua new file mode 100644 index 00000000..3ed06c2e --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/errors.lua @@ -0,0 +1,137 @@ +-- tostring replacement that assigns ids +local ts,id,nid,types = tostring,{},0,{table='tbl',thread='thr',userdata='uda',['function']='func'} +tostring = function(x) + if not x or not types[type(x)] then return ts(x) end + if not id[x] then nid=nid+1; id[x]=types[type(x)]..'.'..nid end + return id[x] +end + +-- test of common types of errors +-- local function c(f,...) return f(...) end +-- local function b(...) return c(...) end +--local function a(...) return (pcall(b,...)) end +local function a(...) local s,e=pcall(...) if s then return s,e else return false,type(e) end end +s = 'some string' +local t = {} +-- error message tests +print( 'a(error)', a(error) ) +print( 'a(error,"msg")', a(error,"msg") ) +print( 'a(error,"msg",0)', a(error,"msg",0) ) +print( 'a(error,"msg",1)', a(error,"msg",1) ) +print( 'a(error,"msg",2)', a(error,"msg",2) ) +print( 'a(error,"msg",3)', a(error,"msg",3) ) +print( 'a(error,"msg",4)', a(error,"msg",4) ) +print( 'a(error,"msg",5)', a(error,"msg",5) ) +print( 'a(error,"msg",6)', a(error,"msg",6) ) + +-- call errors +print( 'a(nil())', a(function() return n() end) ) +print( 'a(t()) ', a(function() return t() end) ) +print( 'a(s()) ', a(function() return s() end) ) +print( 'a(true())', a(function() local b = true; return b() end) ) + +-- arithmetic errors +print( 'a(nil+1)', a(function() return nil+1 end) ) +print( 'a(a+1) ', a(function() return a+1 end) ) +print( 'a(s+1) ', a(function() return s+1 end) ) +print( 'a(true+1)', a(function() local b = true; return b+1 end) ) + +-- table errors +print( 'a(nil.x)', a(function() return n.x end) ) +print( 'a(a.x) ', a(function() return a.x end) ) +print( 'a(s.x) ', a(function() return s.x end) ) +print( 'a(true.x)', a(function() local b = true; return b.x end) ) +print( 'a(nil.x=5)', a(function() n.x=5 end) ) +print( 'a(a.x=5) ', a(function() a.x=5 end) ) +print( 'a(s.x=5) ', a(function() s.x=5 end) ) +print( 'a(true.x=5)', a(function() local b = true; b.x=5 end) ) + +-- len operator +print( 'a(#nil) ', a(function() return #n end) ) +print( 'a(#t) ', a(function() return #t end) ) +print( 'a(#s) ', a(function() return #s end) ) +print( 'a(#a) ', a(function() return #a end) ) +print( 'a(#true)', a(function() local b = true; return #b end) ) + +-- comparison errors +print( 'a(nil>1)', a(function() return nil>1 end) ) +print( 'a(a>1) ', a(function() return a>1 end) ) +print( 'a(s>1) ', a(function() return s>1 end) ) +print( 'a(true>1)', a(function() local b = true; return b>1 end) ) + +-- unary minus errors +print( 'a(-nil)', a(function() return -n end) ) +print( 'a(-a) ', a(function() return -a end) ) +print( 'a(-s) ', a(function() return -s end) ) +print( 'a(-true)', a(function() local b = true; return -b end) ) + +-- string concatenation +local function concatsuite(comparefunc) + print( '"a".."b"', comparefunc("a","b") ) + print( '"a"..nil', comparefunc("a",nil) ) + print( 'nil.."b"', comparefunc(nil,"b") ) + print( '"a"..{}', comparefunc("a",{}) ) + print( '{}.."b"', comparefunc({},"b") ) + print( '"a"..2', comparefunc("a",2) ) + print( '2.."b"', comparefunc(2,"b") ) + print( '"a"..print', comparefunc("a",print) ) + print( 'print.."b"', comparefunc(print,"b") ) + print( '"a"..true', comparefunc("a",true) ) + print( 'true.."b"', comparefunc(true,"b") ) + print( 'nil..true', comparefunc(nil,true) ) + print( '"a"..3.5', comparefunc("a",3.5) ) + print( '3.5.."b"', comparefunc(3.5,"b") ) +end +local function strconcat(a,b) + return (pcall( function() return a..b end) ) +end +local function tblconcat(a,b) + local t={a,b} + return (pcall( function() return table.concat(t,'-',1,2) end )) +end + +print( '-------- string concatenation' ) +concatsuite(strconcat) +print( '-------- table concatenation' ) +concatsuite(tblconcat) + +-- pairs +print( '-------- pairs tests' ) +print( 'a(pairs(nil))', a(function() return pairs(nil,{}) end) ) +print( 'a(pairs(a)) ', a(function() return pairs(a,{}) end) ) +print( 'a(pairs(s)) ', a(function() return pairs(s,{}) end) ) +print( 'a(pairs(t)) ', a(function() return pairs(t,{}) end) ) +print( 'a(pairs(true))', a(function() local b = true; return pairs(b,{}) end) ) + +-- setmetatable +print( '-------- setmetatable tests' ) +function sm(...) + return tostring(setmetatable(...)) +end +print( 'a(setmetatable(nil))', a(function() return sm(nil,{}) end) ) +print( 'a(setmetatable(a)) ', a(function() return sm(a,{}) end) ) +print( 'a(setmetatable(s)) ', a(function() return sm(s,{}) end) ) +print( 'a(setmetatable(true))', a(function() local b = true; return sm(b,{}) end) ) +print( 'a(setmetatable(t)) ', a(function() return sm(t,{}) end) ) +print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) ) +print( 'a(setmetatable(t*)) ', a(function() return sm(t,{__metatable={}}) end) ) +print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) ) +print( 'a(setmetatable(t)) ', a(function() return sm(t,{}) end) ) +print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) ) +t = {} +print( 'a(setmetatable(t)) ', a(function() return sm(t,{}) end) ) +print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) ) +print( 'a(setmetatable(t*)) ', a(function() return sm(t,{__metatable='some string'}) end) ) +print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) ) +print( 'a(setmetatable(t)) ', a(function() return sm(t,{}) end) ) +print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) ) +print( 'a(setmetatable(t,nil)) ', a(function() return sm(t,nil) end) ) +print( 'a(setmetatable(t)) ', a(function() return sm(t) end) ) +print( 'a(setmetatable({},"abc")) ', a(function() return sm({},'abc') end) ) + +-- bad args to error! +print( 'error("msg","arg")', a(function() error('some message', 'some bad arg') end) ) + +-- loadfile, dofile on missing files +print( 'loadfile("bogus.txt")', a(function() return loadfile("bogus.txt") end) ) +print( 'dofile("bogus.txt")', a(function() return dofile("bogus.txt") end) ) diff --git a/luaj-test/src/test/resources/luaj3.0-tests/functions.lua b/luaj-test/src/test/resources/luaj3.0-tests/functions.lua new file mode 100644 index 00000000..e55f0357 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/functions.lua @@ -0,0 +1,74 @@ + +function f0() print( "f0:" ) end +function f1(a) print( "f1:", a ) end +function f2(a,b) print( "f2:", a, b ) end +function f3(a,b,c) print( "f3:", a, b, c ) end +function f4(a,b,c,d) print( "f4:", a, b, c, d ) end + +f0() f0( "a1/1" ) f0( "a1/2", "a2/2" ) f0( "a1/3", "a2/3", "a3/3" ) f0( "a1/4", "a2/4", "a3/4", "a4/4" ) +f1() f1( "a1/1" ) f1( "a1/2", "a2/2" ) f1( "a1/3", "a2/3", "a3/3" ) f1( "a1/4", "a2/4", "a3/4", "a4/4" ) +f2() f2( "a1/1" ) f2( "a1/2", "a2/2" ) f2( "a1/3", "a2/3", "a3/3" ) f2( "a1/4", "a2/4", "a3/4", "a4/4" ) +f3() f3( "a1/1" ) f3( "a1/2", "a2/2" ) f3( "a1/3", "a2/3", "a3/3" ) f3( "a1/4", "a2/4", "a3/4", "a4/4" ) +f4() f4( "a1/1" ) f4( "a1/2", "a2/2" ) f4( "a1/3", "a2/3", "a3/3" ) f4( "a1/4", "a2/4", "a3/4", "a4/4" ) + +function g0(a,b,c,d) return end +function g1(a,b,c,d) return d end +function g2(a,b,c,d) return c, d end +function g3(a,b,c,d) return b, c, d end +function g4(a,b,c,d) return a, b, c, d end + +z = g0("c0.1/4", "c0.2/4", "c0.3/4", "c0.4/4") +print( "z0:", z ) +z = g2("c2.1/4", "c2.2/4", "c2.3/4", "c2.4/4") +print( "z2:", z ) +z = g4("c4.1/4", "c4.2/4", "c4.3/4", "c4.4/4") +print( "z4:", z ) + +a,b,c,d = g0( "c0.1/4", "c0.2/4", "c0.3/4", "c0.4/4" ) +print( "g0:", a, b, c, d, "(eol)" ) +a,b,c,d = g2( "b2.1/4", "b2.2/4", "b2.3/4", "b2.4/4" ) +print( "g2:", a, b, c, d, "(eol)" ) +a,b,c,d = g4( "b4.1/4", "b4.2/4", "b4.3/4", "b4.4/4" ) +print( "g4:", a, b, c, d, "(eol)" ) + +function func(a,b,c) + return a, b, c +end + +print( func(11, 12, 13) ) +print( func(23, 22, 21) ) +print( func(func(32,33,34), func(45,46,47), func(58,59,50)) ) + +function p(a,...) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) +end +p() +p("q") +p("q","r") +p("q","r","s") + +-- tail call tests +function first(...) + return 'abc', ..., '|', ... +end + +function second(a,...) + return 'def', ..., '|', a, ... +end + +function third( a, b, c ) + print( 'third', first( a, b, c ) ) + print( 'third', second( a, b, c ) ) + return second( a, b, c ) +end + +print( 'third', third() ) +print( 'third', third('p') ) +print( 'third', third('p','q') ) +print( 'third', third('p','q','r') ) +print( 'third', third('p','q','r','s') ) +print( 'third', third() ) + diff --git a/luaj-test/src/test/resources/luaj3.0-tests/iolib.lua b/luaj-test/src/test/resources/luaj3.0-tests/iolib.lua new file mode 100644 index 00000000..3264b704 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/iolib.lua @@ -0,0 +1,153 @@ +local platform = ... +print( 'platform', platform ) + +-- simple io-library tests +-- +-- C version on Windows will add change \n into \r\n for text files at least +-- +local tostr,files,nfiles = tostring,{},0 +tostring = function(x) + local s = tostr(x) + if s:sub(1,4) ~= 'file' then return s end + if files[s] then return files[s] end + files[s] = 'file.'..nfiles + nfiles = nfiles + 1 + return files[s] +end +print( io ~= nil ) +print( io.open ~= nil ) +print( io.stdin ~= nil ) +print( io.stdout ~= nil ) +print( io.stderr ~= nil ) +print( 'write', io.write() ) +print( 'write', io.write("This") ) +print( 'write', io.write(" is a pen.") ) +print( 'flush', io.flush() ) + +local f = io.open("abc.txt","w") +print( 'f', type(f) ) +print( io.type(f) ) +print( 'write', f:write("abcdef 12345 \t\t 678910 more\aaaaaaa\bbbbthe rest") ) +print( 'type(f)', io.type(f) ) +print( 'close', f:close() ) +print( 'type(f)', io.type(f) ) +print( 'type("f")', io.type("f") ) + +local g = io.open("abc.txt","r") +local t = { g:read(3, 3, "*n", "*n", "*l", "*l", "*a") } +for i,v in ipairs(t) do + print( string.format("%q",tostring(v)), type(v)) + print( '----- ', i ) +end + +local h,s = io.open("abc.txt", "a") +print( 'h', io.type(h), string.sub(tostring(h),1,6), s ) +print( 'write', h:write('and more and more and more text.') ) +print( 'close', h:close() ) + +if platform ~= 'JME' then + local j = io.open( "abc.txt", "r" ) + print( 'j', io.type(j) ) + print( 'seek', j:seek("set", 3) ) + print( 'read', j:read(4), j:read(3) ) + print( 'seek', j:seek("set", 2) ) + print( 'read', j:read(4), j:read(3) ) + print( 'seek', j:seek("cur", -8 ) ) + print( 'read', j:read(4), j:read(3) ) + print( 'seek(cur,0)', j:seek("cur",0) ) + print( 'seek(cur,20)', j:seek("cur",20) ) + print( 'seek(end,-5)', j:seek("end", -5) ) + print( 'read(4)', string.format("%q", tostring(j:read(4))) ) + print( 'read(4)', string.format("%q", tostring(j:read(4))) ) + print( 'read(4)', string.format("%q", tostring(j:read(4))) ) + print( 'close', j:close() ) +end + +-- write a few lines, including a non-terminating one +files = {} +f = io.open("abc.txt","w") +print( 'f.type', io.type(f) ) +print( 'f', f ) +print( 'write', f:write("line one\nline two\n\nafter blank line\nunterminated line") ) +print( 'type(f)', io.type(f) ) +print( 'close', f:close() ) +files = {} + +-- read using io.lines() +for l in io.lines("abc.txt") do + print( string.format('%q',l) ) +end +io.input("abc.txt") +for l in io.lines() do + print( string.format('%q',l) ) +end +io.input(io.open("abc.txt","r")) +for l in io.lines() do + print( string.format('%q',l) ) +end +io.input("abc.txt") +io.input(io.input()) +for l in io.lines() do + print( string.format('%q',l) ) +end + +local count = 0 +io.tmpfile = function() + count = count + 1 + return io.open("tmp"..count..".out","w") +end + +local a = io.tmpfile() +local b = io.tmpfile() +print( io.type(a) ) +print( io.type(b) ) +print( "a:write", a:write('aaaaaaa') ) +print( "b:write", b:write('bbbbbbb') ) +print( "a:setvbuf", a:setvbuf("no") ) +print( "a:setvbuf", a:setvbuf("full",1024) ) +print( "a:setvbuf", a:setvbuf("line") ) +print( "a:write", a:write('ccccc') ) +print( "b:write", b:write('ddddd') ) +print( "a:flush", a:flush() ) +print( "b:flush", b:flush() ) +--[[ +print( "a:read", a:read(7) ) +print( "b:read", b:read(7) ) +print( "a:seek", a:seek("cur",-4) ) +print( "b:seek", b:seek("cur",-4) ) +print( "a:read", ( a:read(7) ) ) +print( "b:read", ( b:read(7) ) ) +print( "a:seek", a:seek("cur",-8) ) +print( "b:seek", b:seek("cur",-8) ) +print( "a:read", ( a:read(7) ) ) +print( "b:read", ( b:read(7) ) ) +--]] + +local pcall = function(...) + local s,e = pcall(...) + if s then return s end + return s,e:match("closed") +end + +print( 'a:close', pcall( a.close, a ) ) +print( 'a:write', pcall( a.write, a, 'eee') ) +print( 'a:flush', pcall( a.flush, a) ) +print( 'a:read', pcall( a.read, a, 5) ) +print( 'a:lines', pcall( a.lines, a) ) +print( 'a:seek', pcall( a.seek, a, "cur", -2) ) +print( 'a:setvbuf', pcall( a.setvbuf, a, "no") ) +print( 'a:close', pcall( a.close, a ) ) +print( 'io.type(a)', pcall( io.type, a ) ) + +print( 'io.close()', pcall( io.close ) ) +print( 'io.close(io.output())', pcall( io.close, io.output() ) ) + +io.output('abc.txt') +print( 'io.close()', pcall( io.close ) ) +print( 'io.write', pcall( io.write, 'eee') ) +print( 'io.flush', pcall( io.flush) ) +print( 'io.close', pcall( io.close ) ) +io.input('abc.txt'):close() +print( 'io.read', pcall( io.read, 5) ) +print( 'io.lines', pcall( io.lines) ) + diff --git a/luaj-test/src/test/resources/luaj3.0-tests/manyupvals.lua b/luaj-test/src/test/resources/luaj3.0-tests/manyupvals.lua new file mode 100644 index 00000000..e1ae06ce --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/manyupvals.lua @@ -0,0 +1,37 @@ +local t = {} +local template = [[ + local f + do + local result + function f() + if not result then + result = f() + f() + end + return result + end + end +]] +t[1] = [[ + local f1 + f1 = function() return 1 end +]] +t[2] = [[ + local f2 + f2 = function() return 1 end +]] +for i = 3, 199 do + t[i] = template:gsub("<([^>]+)>", function(s) + local c = assert(load('return '..s, 'f'..i, 'bt', { i = i }), 'could not compile: '..s) + return c() + end) +end +t[200] = [[ + print("5th fibonacci number is", f5()) + print("10th fibonacci number is", f10()) + print("199th fibonacci number is", f199()) +]] + +local s = table.concat(t) +print(s) +f = load(s) +f() diff --git a/luaj-test/src/test/resources/luaj3.0-tests/mathlib.lua b/luaj-test/src/test/resources/luaj3.0-tests/mathlib.lua new file mode 100644 index 00000000..5f14e6f6 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/mathlib.lua @@ -0,0 +1,239 @@ +local platform = ... +print( 'platform', platform ) + +local aliases = { + ['0']='', + ['-0']='', + ['nan']='', + ['inf']='', + ['-inf']='', + ['1.#INF']='', + ['-1.#INF']='', + ['1.#IND']='', + ['-1.#IND']='', +} + +local UNOPVALUES = { -2.5, -2, 0, 2, 2.5, "'-2.5'", "'-2'", "'0'", "'2'", "'2.5'" } + +local NUMBERPAIRS = { + { 2, 0 }, { -2.5, 0 }, { 2, 1 }, + { 5, 2 }, {-5, 2 }, {16, 2}, {-16, -2}, + { .5, 0}, {.5, 1}, {.5, 2}, {.5, -1}, {.5, 2}, + {2.25, 0}, {2.25, 2}, {-2, 0}, + { 3, 3 }, +} + +local STRINGPAIRS = { + { "'2'", "'0'" }, { "'2.5'","'3'" }, { "'-2'", "'1.5'" }, { "'-2.5'", "'-1.5'" }, + { "'3.0'", "'3.0'" }, { 2.75, 2.75 }, { "'2.75'", "'2.75'" }, +} + +local MIXEDPAIRS = { + { 3, "'3'" }, { "'3'", 3 }, { 2.75, "'2.75'" }, { "'2.75'", 2.75 }, + { -3, "'-4'" }, { "'-3'", 4 }, { -3, "'4'" }, { "'-3'", -4 }, + { -4.75, "'2.75'" }, { "'-2.75'", 1.75 }, { 4.75, "'-2.75'" }, { "'2.75'", -1.75 }, +} + +local BINOPVALUES = {} + +local RELATIONALOPVALUES = {} + +local function addall( t, s ) + for i,v in ipairs(s) do + t[#t+1] = v + end +end +addall( BINOPVALUES, NUMBERPAIRS ) +addall( BINOPVALUES, STRINGPAIRS ) +addall( BINOPVALUES, MIXEDPAIRS ) +addall( RELATIONALOPVALUES, NUMBERPAIRS ) +addall( RELATIONALOPVALUES, STRINGPAIRS ) + +local VARARGSVALUES = { + { 4, }, { -4.5 }, { "'5.5'" }, { "'-5'" }, + { 4, "'8'" }, { -4.5, "'-8'" }, { "'5.5'", 2.2 }, { "'-5'", -2.2 }, + { 111,222,333 }, { -222,-333,-111 }, { 444,-111,-222 }, +} + +local CONSTANTS = { + "huge", "pi", +} +local UNARYOPS = { + "-", "not ", +} +local BINARYOPS = { + "+", "-", "*", "^", "/", "%", +} +local RELATIONALS = { + "==", "~=", ">", "<", ">=", "<=", +} +local ONEARG_JME = { + "abs", "ceil", "cos", "deg", + "exp", "floor", "frexp", "modf", + "rad", "sin", "sqrt", "tan", +} +local ONEARG_JSE = { + "acos", "asin", "atan", "cosh", + "log", "sinh", "tanh", +} +local TWOARGS_JME = { + "fmod", "ldexp", "pow", +} +local TWOARGS_JSE = { + "atan2", +} +local VARARGSFUNCS = { + "max", "min", +} + +local ts = tostring +tostring = function(x) + local s = ts(x) + if type(x)~='number' then return s end + if aliases[s] then return aliases[s] end + if #s < 7 then return s end + local a,b = string.match(s,'([%-0-9%.]*)([eE]?[%-0-9]*)') + return a and (string.sub(a,1,6)..(b or '')) or s +end + +local function eval( expr, script ) + script = script or ('return '..expr) + local s,a,b = load( script, 'expr' ) + if s then print( expr, pcall( s ) ) + else print( expr, 'load:', a ) end +end + +-- misc tests +print( '---------- miscellaneous tests ----------' ) +eval( 'math.sin( 0.0 )' ) +eval( 'math.cos( math.pi )' ) +eval( 'math.sqrt( 9.0 )' ) +eval( 'math.modf( 5.25 )') +eval( 'math.frexp(0.00625)' ) +eval( '-5 ^ 2' ) +eval( '-5 / 2' ) +eval( '-5 % 2' ) + +-- constants +print( '---------- constants ----------' ) +for i,v in ipairs(CONSTANTS) do + eval( 'math.'..v ) +end + +-- unary operators +for i,v in ipairs(UNARYOPS) do + print( '---------- unary operator '..v..' ----------' ) + for j,a in ipairs(UNOPVALUES) do + eval( v..a, 'return '..v..a ) + end +end + +-- binary operators +for i,v in ipairs(BINARYOPS) do + print( '---------- binary operator '..v..' ----------' ) + for j,xy in ipairs(BINOPVALUES) do + eval( xy[1]..v..xy[2], + 'local x,y='..xy[1]..','..xy[2]..'; return x'..v..'y' ) + end +end + +-- relational operators +for i,v in ipairs(RELATIONALS) do + print( '---------- binary operator '..v..' ----------' ) + for j,xy in ipairs(RELATIONALOPVALUES) do + eval( xy[1]..v..xy[2], + 'local x,y='..xy[1]..','..xy[2]..'; return x'..v..'y' ) + end +end + +-- one-argument math functions +for i,v in ipairs(ONEARG_JME) do + print( '---------- math.'..v..' ----------' ) + for j,x in ipairs(UNOPVALUES) do + eval( 'math.'..v..'('..x..')' ) + end +end +if platform ~= 'JME' then + for i,v in ipairs(ONEARG_JSE) do + print( '---------- math.'..v..' (jse only) ----------' ) + for j,x in ipairs(UNOPVALUES) do + eval( 'math.'..v..'('..x..')' ) + end + end +end + +-- two-argument math functions +for i,v in ipairs(TWOARGS_JME) do + print( '---------- math.'..v..' ----------' ) + for j,x in ipairs(BINOPVALUES) do + eval( 'math.'..v..'('..x[1]..','..x[2]..')' ) + end +end +if platform ~= 'JME' then + for i,v in ipairs(TWOARGS_JSE) do + print( '---------- math.'..v..' (jse only) ----------' ) + for j,x in ipairs(BINOPVALUES) do + eval( 'math.'..v..'('..x[1]..','..x[2]..')' ) + end + end +end + +-- var-arg math functions +for i,v in ipairs(VARARGSFUNCS) do + print( '---------- math.'..v..' ----------' ) + for j,x in ipairs(VARARGSVALUES) do + eval( 'math.'..v..'('..table.concat(x,',')..')' ) + end +end + +-- random tests +print("----------- Random number tests") +local function testrandom(string,lo,hi) + local c,e = load('return '..string) + for i=1,5 do + local s,e = pcall(c) + if s then + print( string, s and type(e) or e, (e>=lo) and (e<=hi) ) + else + print( string, 'error', e ) + end + end +end +testrandom('math.random()',0,1) +testrandom('math.random(5,10)',5,10) +testrandom('math.random(30)',0,30) +testrandom('math.random(-4,-2)',-4,-2) +local t = {} +print( math.randomseed(20) ) +for i=1,20 do + t[i] = math.random() +end +print( '-- comparing new numbers') +for i=1,20 do + print( t[i] == math.random(), t[i] == t[0] ) +end +print( '-- resetting seed') + +print( math.randomseed(20) ) +for i=1,20 do + print( t[i] == math.random() ) +end + +-- tests involving -0, which is folded into 0 for luaj, but not for plain lua +print("----------- Tests involving -0 and NaN") +print('0 == -0', 0 == -0) +t = {[0] = 10, 20, 30, 40, 50} +print('t[-0] == t[0]',t[-0] == t[0]) +local x = -1 +local mz, z = 0/x, 0 -- minus zero, zero +print('mz, z', mz, z) +print('mz == z', mz == z) +local a = {[mz] = 1} +print('a[z] == 1 and a[mz] == 1', a[z] == 1 and a[mz] == 1) +-- string with same binary representation as 0.0 (may create problems +-- for constant manipulation in the pre-compiler) +local a1, a2, a3, a4, a5 = 0, 0, "\0\0\0\0\0\0\0\0", 0, "\0\0\0\0\0\0\0\0" +assert(a1 == a2 and a2 == a4 and a1 ~= a3) +assert(a3 == a5) + +--]] diff --git a/luaj-test/src/test/resources/luaj3.0-tests/metatags.lua b/luaj-test/src/test/resources/luaj3.0-tests/metatags.lua new file mode 100644 index 00000000..676590be --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/metatags.lua @@ -0,0 +1,286 @@ +local anumber,bnumber = 111,23.45 +local astring,bstring = "abc","def" +local anumstr,bnumstr = tostring(anumber),tostring(bnumber) +local aboolean,bboolean = false,true +local afunction,bfunction = function() end, function() end +local athread,bthead = coroutine.create(afunction),coroutine.create(bfunction) +local atable,btable = {},{} +local values = { anumber, aboolean, afunction, athread, atable } +local groups +local ts = tostring +local tb,count = {},0 + +tostring = function(o) + local t = type(o) + if t~='thread' and t~='function' and t~='table' then return ts(o) end + if not tb[o] then + count = count + 1 + tb[o] = t..'.'..count + end + return tb[o] +end + +local buildop = function(name) + return function(a,b) + print( 'mt.__'..name..'()', a, b ) + return '__'..name..'-result' + end +end +local buildop3 = function(name) + return function(a,b,c) + print( 'mt.__'..name..'()', a, b, c ) + return '__'..name..'-result' + end +end +local buildop1 = function(name) + return function(a) + print( 'mt.__'..name..'()', a ) + return '__'..name..'-result' + end +end + +local mt = { + __call=buildop('call'), + __add=buildop('add'), + __sub=buildop('sub'), + __mul=buildop('mul'), + __div=buildop('div'), + __pow=buildop('pow'), + __mod=buildop('mod'), + __unm=buildop1('unm'), + __len=buildop1('len'), + __lt=buildop('lt'), + __le=buildop('le'), + __index=buildop('index'), + __newindex=buildop3('newindex'), + __concat=buildop('concat'), +} + +-- pcall a function and check for a pattern in the error string +ecall = function(pattern, ...) + local s,e = pcall(...) + if not s then e = string.match(e,pattern) or e end + return s,e +end + +print( '---- __eq same types' ) +local eqmt = { __eq=buildop('eq'), } +groups = { {nil,nil}, {true,false}, {123,456}, {11,5.5}, {afunction,bfunction}, {athread,bthread}, {astring,bstring}, {anumber,anumstr} } +for i=1,#groups do + local a,b = groups[i][1], groups[i][2] + local amt,bmt = debug.getmetatable(a),debug.getmetatable(b) + print( type(a), type(b), 'before', pcall( function() return a==b end ) ) + print( type(a), type(b), 'before', pcall( function() return a~=b end ) ) + print( debug.setmetatable( a, eqmt ) ) + print( debug.setmetatable( b, eqmt ) ) + print( type(a), type(b), 'after', pcall( function() return a==b end ) ) + print( type(a), type(b), 'after', pcall( function() return a~=b end ) ) + print( debug.setmetatable( a, amt ) ) + print( debug.setmetatable( b, bmt ) ) +end + +print( '---- __eq, tables - should invoke metatag comparison' ) +groups = { {atable,btable} } +for i=1,#groups do + local a,b = groups[i][1], groups[i][2] + local amt,bmt = debug.getmetatable(a),debug.getmetatable(b) + print( type(a), type(b), 'before', pcall( function() return a==b end ) ) + print( type(a), type(b), 'before', pcall( function() return a~=b end ) ) + print( debug.setmetatable( a, eqmt ) ) + print( debug.setmetatable( b, eqmt ) ) + print( type(a), type(b), 'after-a', pcall( function() return a==b end ) ) + print( type(a), type(b), 'after-a', pcall( function() return a~=b end ) ) + print( debug.setmetatable( a, amt ) ) + print( debug.setmetatable( b, bmt ) ) +end + + +print( 'nilmt', debug.getmetatable(nil) ) +print( 'boolmt', debug.getmetatable(true) ) +print( 'number', debug.getmetatable(1) ) +print( 'function', debug.getmetatable(afunction) ) +print( 'thread', debug.getmetatable(athread) ) + +print( '---- __call' ) +for i=1,#values do + local a = values[i] + local amt = debug.getmetatable(a) + print( type(a), 'before', ecall( 'attempt to call', function() return a('a','b') end ) ) + print( debug.setmetatable( a, mt ) ) + print( type(a), 'after', pcall( function() return a() end ) ) + print( type(a), 'after', pcall( function() return a('a') end ) ) + print( type(a), 'after', pcall( function() return a('a','b') end ) ) + print( type(a), 'after', pcall( function() return a('a','b','c') end ) ) + print( type(a), 'after', pcall( function() return a('a','b','c','d') end ) ) + print( debug.setmetatable( a, amt ) ) +end + +print( '---- __add, __sub, __mul, __div, __pow, __mod' ) +local groups = { {aboolean, aboolean}, {aboolean, athread}, {aboolean, afunction}, {aboolean, "abc"}, {aboolean, atable} } +for i=1,#groups do + local a,b = groups[i][1], groups[i][2] + local amt,bmt = debug.getmetatable(a),debug.getmetatable(b) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return a+b end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return b+a end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return a-b end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return b-a end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return a*b end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return b*a end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return a^b end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return b^a end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return a%b end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return b%a end ) ) + print( debug.setmetatable( a, mt ) ) + print( type(a), type(b), 'after', pcall( function() return a+b end ) ) + print( type(a), type(b), 'after', pcall( function() return b+a end ) ) + print( type(a), type(b), 'after', pcall( function() return a-b end ) ) + print( type(a), type(b), 'after', pcall( function() return b-a end ) ) + print( type(a), type(b), 'after', pcall( function() return a*b end ) ) + print( type(a), type(b), 'after', pcall( function() return b*a end ) ) + print( type(a), type(b), 'after', pcall( function() return a^b end ) ) + print( type(a), type(b), 'after', pcall( function() return b^a end ) ) + print( type(a), type(b), 'after', pcall( function() return a%b end ) ) + print( type(a), type(b), 'after', pcall( function() return b%a end ) ) + print( debug.setmetatable( a, amt ) ) + print( debug.setmetatable( b, bmt ) ) +end + +print( '---- __len' ) +values = { aboolean, afunction, athread, anumber } +for i=1,#values do + local a = values[i] + local amt = debug.getmetatable(a) + print( type(a), 'before', ecall( 'attempt to get length of ', function() return #a end ) ) + print( debug.setmetatable( a, mt ) ) + print( type(a), 'after', pcall( function() return #a end ) ) + print( debug.setmetatable( a, amt ) ) +end +-- +print( '---- __neg' ) +values = { aboolean, afunction, athread, "abcd", atable, anumber } +for i=1,#values do + local a = values[i] + local amt = debug.getmetatable(a) + print( type(v), 'before', ecall( 'attempt to perform arithmetic ', function() return -a end ) ) + print( debug.setmetatable( a, mt ) ) + print( type(v), 'after', pcall( function() return -a end ) ) + print( debug.setmetatable( a, amt ) ) +end + +print( '---- __lt, __le, same types' ) +local bfunction = function() end +local bthread = coroutine.create( bfunction ) +local btable = {} +local groups +groups = { {true, true}, {true, false}, {afunction, bfunction}, {athread, bthread}, {atable, atable}, {atable, btable} } +for i=1,#groups do + local a,b = groups[i][1], groups[i][2] + local amt,bmt = debug.getmetatable(a),debug.getmetatable(b) + print( type(a), type(b), 'before', ecall( 'attempt to compare', function() return ab end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to compare', function() return a>=b end ) ) + print( debug.setmetatable( a, mt ) ) + print( debug.setmetatable( b, mt ) ) + print( type(a), type(b), 'after', pcall( function() return ab end ) ) + print( type(a), type(b), 'after', pcall( function() return a>=b end ) ) + print( debug.setmetatable( a, amt ) ) + print( debug.setmetatable( b, bmt ) ) +end + +print( '---- __lt, __le, different types' ) +groups = { {aboolean, athread}, } +for i=1,#groups do + local a,b = groups[i][1], groups[i][2] + local amt,bmt = debug.getmetatable(a),debug.getmetatable(b) + print( type(a), type(b), 'before', ecall( 'attempt to compare', function() return ab end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to compare', function() return a>=b end ) ) + print( debug.setmetatable( a, mt ) ) + print( debug.setmetatable( b, mt ) ) + print( type(a), type(b), 'after-a', ecall( 'attempt to compare', function() return ab end ) ) + print( type(a), type(b), 'after-a', ecall( 'attempt to compare', function() return a>=b end ) ) + print( debug.setmetatable( a, amt ) ) + print( debug.setmetatable( b, bmt ) ) +end + +print( '---- __tostring' ) +values = { aboolean, afunction, athread, atable, "abc" } +local strmt = { __tostring=function(a) + return 'mt.__tostring('..type(a)..')' + end, +} +for i=1,#values do + local a = values[i] + local amt = debug.getmetatable(a) + print( debug.setmetatable( a, strmt ) ) + print( type(a), 'after', pcall( function() return ts(a) end ) ) + print( debug.setmetatable( a, amt ) ) +end + +print( '---- __index, __newindex' ) +values = { aboolean, anumber, afunction, athread } +for i=1,#values do + local a = values[i] + local amt = debug.getmetatable(a) + print( type(a), 'before', ecall( 'attempt to index', function() return a.foo end ) ) + print( type(a), 'before', ecall( 'attempt to index', function() return a[123] end ) ) + print( type(a), 'before', ecall( 'index', function() a.foo = 'bar' end ) ) + print( type(a), 'before', ecall( 'index', function() a[123] = 'bar' end ) ) + print( type(a), 'before', ecall( 'attempt to index', function() return a:foo() end ) ) + print( debug.setmetatable( a, mt ) ) + print( type(a), 'after', pcall( function() return a.foo end ) ) + print( type(a), 'after', pcall( function() return a[123] end ) ) + print( type(a), 'after', pcall( function() a.foo = 'bar' end ) ) + print( type(a), 'after', pcall( function() a[123] = 'bar' end ) ) + print( type(a), 'after', ecall( 'attempt to call', function() return a:foo() end ) ) + print( debug.setmetatable( a, amt ) ) +end + +print( '---- __concat' ) +groups = { {atable, afunction}, {afunction, atable}, {123, nil}, {nil, 123} } +local s,t,u = 'sss',777 +local concatresult = setmetatable( { '__concat-result' }, { + __tostring=function() + return 'concat-string-result' + end } ) +local concatmt = { + __concat=function(a,b) + print( 'mt.__concat('..type(a)..','..type(b)..')', a, b ) + return concatresult + end +} +for i=1,#groups do + local a,b = groups[i][1], groups[i][2] + local amt,bmt = debug.getmetatable(a),debug.getmetatable(b) + print( type(a), type(b), 'before', ecall( 'attempt to concatenate ', function() return a..b end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to concatenate ', function() return b..a end ) ) + print( type(a), type(s), type(t), 'before', ecall( 'attempt to concatenate ', function() return a..s..t end ) ) + print( type(s), type(a), type(t), 'before', ecall( 'attempt to concatenate ', function() return s..a..t end ) ) + print( type(s), type(t), type(a), 'before', ecall( 'attempt to concatenate ', function() return s..t..a end ) ) + print( debug.setmetatable( a, concatmt ) ) + print( type(a), type(b), 'after', pcall( function() return a..b end ) ) + print( type(a), type(b), 'after', pcall( function() return b..a end ) ) + print( type(a), type(s), type(t), 'before', pcall( function() return a..s..t end ) ) + print( type(s), type(a), type(t), 'before', ecall( 'attempt to concatenate ', function() return s..a..t end ) ) + print( type(s), type(t), type(a), 'before', ecall( 'attempt to concatenate ', function() return s..t..a end ) ) + print( debug.setmetatable( a, amt ) ) + print( debug.setmetatable( b, bmt ) ) +end + +print( '---- __metatable' ) +values = { aboolean, afunction, athread, atable, "abc" } +local mtmt = { __metatable={}, } +for i=1,#values do + local a = values[i] + local amt = debug.getmetatable(a) + print( type(a), 'before', pcall( function() return debug.getmetatable(a), getmetatable(a) end ) ) + print( debug.setmetatable( a, mtmt ) ) + print( type(a), 'after', pcall( function() return debug.getmetatable(a), getmetatable(a) end ) ) + print( debug.setmetatable( a, amt ) ) +end diff --git a/luaj-test/src/test/resources/luaj3.0-tests/oslib.lua b/luaj-test/src/test/resources/luaj3.0-tests/oslib.lua new file mode 100644 index 00000000..4ca5da54 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/oslib.lua @@ -0,0 +1,39 @@ +-- simple os-library tests +-- +-- because the nature of the "os" library is to provide os-specific behavior, +-- the compatibility tests must be extremely loose, and can really only +-- compare things like return value type to be meaningful. +-- +-- actual os behavior needs to go in an oslib function test +-- +local pcall = function(...) + local s,e,f = pcall(...) + return s,type(e),type(f) +end +print( 'os', type(os) ) +print( 'os.clock()', pcall( os.clock ) ) +print( 'os.date()', pcall( os.date ) ) +print( 'os.difftime(123000, 21500)', pcall( os.difftime, 123000, 21250 ) ) +print( 'os.getenv()', pcall( os.getenv ) ) +print( 'os.getenv("bogus.key")', pcall( os.getenv, 'bogus.key' ) ) +local s,p = pcall( os.tmpname ) +local s,q = pcall( os.tmpname ) +print( 'os.tmpname()', s, p ) +print( 'os.tmpname()', s, q ) +-- permission denied on windows +--print( 'os.remove(p)', pcall( os.remove, p ) ) +--print( 'os.rename(p,q)', pcall( os.rename, p, q ) ) +local s,f = pcall( io.open, p,"w" ) +print( 'io.open', s, f ) +print( 'write', pcall( f.write, f, "abcdef 12345" ) ) +print( 'close', pcall( f.close, f ) ) +print( 'os.rename(p,q)', pcall( os.rename, p, q ) ) +print( 'os.remove(q)', pcall( os.remove, q ) ) +print( 'os.remove(q)', pcall( os.remove, q ) ) +-- setlocale not supported on jse yet +-- print( 'os.setlocale()', pcall( os.setlocale ) ) +-- print( 'os.setlocale("jp")', pcall( os.setlocale, "jp" ) ) +-- print( 'os.setlocale("us","monetary")', pcall( os.setlocale, "us", "monetary" ) ) +-- print( 'os.setlocale(nil,"all")', pcall( os.setlocale, nil, "all" ) ) +print( 'os.setlocale("C")', pcall( os.setlocale, "C" ) ) +print( 'os.exit', type(os.exit) ) diff --git a/luaj-test/src/test/resources/luaj3.0-tests/stringlib.lua b/luaj-test/src/test/resources/luaj3.0-tests/stringlib.lua new file mode 100644 index 00000000..5bf09550 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/stringlib.lua @@ -0,0 +1,189 @@ +print( string.find("1234567890", ".", 0, true) ) +print( string.find( 'alo alx 123 b\0o b\0o', '(..*) %1' ) ) +print( string.find( 'aloALO', '%l*' ) ) +print( string.find( ' \n isto � assim', '%S%S*' ) ) + +print( string.find( "", "" ) ) +print( string.find( "ababaabbaba", "abb" ) ) +print( string.find( "ababaabbaba", "abb", 7 ) ) + +print( string.match( "aabaa", "a*" ) ) +print( string.match( "aabaa", "a*", 3 ) ) +print( string.match( "aabaa", "a*b" ) ) +print( string.match( "aabaa", "a*b", 3 ) ) + +print( string.match( "abbaaababaabaaabaa", "b(a*)b" ) ) + +print( string.match( "abbaaababaabaaabaa", "b(a*)()b" ) ) +print( string.match( "abbaaababaabaaabaa", "b(a*)()b", 3 ) ) +print( string.match( "abbaaababaabaaabaa", "b(a*)()b", 8 ) ) +print( string.match( "abbaaababaabaaabaa", "b(a*)()b", 12 ) ) + +print( string.byte("hi", -3) ) + +print( string.gsub("ABC", "@(%x+)", function(s) return "|abcd" end) ) +print( string.gsub("@123", "@(%x+)", function(s) return "|abcd" end) ) +print( string.gsub("ABC@123", "@(%x+)", function(s) return "|abcd" end) ) +print( string.gsub("ABC@123@def", "@(%x+)", function(s) return "|abcd" end) ) +print( string.gsub("ABC@123@qrs@def@tuv", "@(%x+)", function(s) return "|abcd" end) ) +print( string.gsub("ABC@123@qrs@def@tuv", "@(%x+)", function(s) return "@ab" end) ) + +print( tostring(1234567890123) ) +print( tostring(1234567890124) ) +print( tostring(1234567890125) ) + +function f1(s, p) + print(p) + p = string.gsub(p, "%%([0-9])", function (s) return "%" .. (s+1) end) + print(p) + p = string.gsub(p, "^(^?)", "%1()", 1) + print(p) + p = string.gsub(p, "($?)$", "()%1", 1) + print(p) + local t = {string.match(s, p)} + return string.sub(s, t[1], t[#t] - 1) +end + +print( pcall( f1, 'alo alx 123 b\0o b\0o', '(..*) %1' ) ) + +local function badpat() + print( string.gsub( "alo", "(.)", "%2" ) ) +end + +print( ( pcall( badpat ) ) ) + +for k, v in string.gmatch("w=200&h=150", "(%w+)=(%w+)") do + print(k, v) +end + +-- string.sub +function t(str) + local i = { 0, 1, 2, 8, -1 } + for ki,vi in ipairs(i) do + local s,v = pcall( string.sub, str, vi ) + print( 'string.sub("'..str..'",'..tostring(vi)..')='..tostring(s)..',"'..tostring(v)..'"' ) + local j = { 0, 1, 2, 4, 8, -1 } + for kj,vj in ipairs(j) do + local s,v = pcall( string.sub, str, vi, vj ) + print( 'string.sub("'..str..'",'..tostring(vi)..','..tostring(vj)..')='..tostring(s)..',"'..tostring(v)..'"' ) + end + end +end +t( 'abcdefghijklmn' ) +t( 'abcdefg' ) +t( 'abcd' ) +t( 'abc' ) +t( 'ab' ) +t( 'a' ) +t( '' ) + +print(string.len("Hello, world")) +print(#"Hello, world") +print(string.len("\0\0\0")) +print(#"\0\0\0") +print(string.len("\0\1\2\3")) +print(#"\0\1\2\3") +local s = "My JaCk-O-lAnTeRn CaSe TeXt" +print(s, string.len(s), #s) + + +-- string.format +print(string.format("(%.0d) (%.0d) (%.0d)", 0, -5, 9)) +print(string.format("(%.1d) (%.1d) (%.1d)", 0, -5, 9)) +print(string.format("(%.2d) (%.2d) (%.2d)", 0, -5, 9)) + +print(string.format("(%+.0d) (%+.0d) (%+.0d)", 0, -5, 9)) +print(string.format("(%+.1d) (%+.1d) (%+.1d)", 0, -5, 9)) +print(string.format("(%+.2d) (%+.2d) (%+.2d)", 0, -5, 9)) + +print(string.format("(%+3d) (% 3d) (%+ 3d)", 55, 55, 55)) + +print(string.format("(%-1d) (%-1d) (%-1d)", 1, 12, -12)) +print(string.format("(%-2d) (%-2d) (%-2d)", 1, 12, -12)) +print(string.format("(%-3d) (%-3d) (%-3d)", 1, 12, -12)) + + +print(string.format("(%8x) (%8d) (%8o)", 255, 255, 255)) +print(string.format("(%08x) (%08d) (%08o)", 255, 255, 255)) + +print(string.format("simple%ssimple", " simple ")) + +local testformat = function(message,fmt,...) + local s,e = pcall( string.format, fmt, ... ) + if s then + if string.find(fmt, 'q') then + print(message, e) + end + print( message, string.byte(e,1,#e) ) + else + print( message, 'error', e ) + end +end + +testformat('plain %', "%%") +testformat("specials (%s)", "---%s---", " %% \000 \r \n ") +testformat("specials (%q)", "---%q---", " %% \000 \r \n ") +testformat("specials (%q)", "---%q---", "0%%0\0000\r0\n0") +testformat("controls (%q)", "---%q---", ' \a \b \f \t \v \\ ') +testformat("controls (%q)", "---%q---", '0\a0\b0\f0\t0\v0\\0') +testformat("extended (%q)", "---%q---", ' \222 \223 \224 ') +testformat("extended (%q)", "---%q---", '0\2220\2230\2240') +testformat("embedded newlines", "%s\r%s\n%s", '===', '===', '===') + +-- format long string +print("this is a %s long string", string.rep("really, ", 30)) + +local function pc(...) + local s,e = pcall(...) + return s and e or 'false-'..type(e) +end + +local function strtests(name,func,...) + print(name, 'good', pc( func, ... ) ) + print(name, 'empty', pc( func ) ) + print(name, 'table', pc( func, {} ) ) + print(name, 'nil', pc( func, nil ) ) +end + +strtests('lower', string.lower, s ) +strtests('upper', string.upper, s ) +strtests('reverse', string.reverse, s ) +strtests('char', string.char, 92, 60, 61, 93 ) +print( 'string.dump test:', load(string.dump(function(x) return 'foo->'..x end),'bar')('bat') ) + + +-- floating point formats (not supported yet) +--[==[ +local prefixes = {'','+','-'} +local lengths = {'7','2','0','1',''} +local letters = {'f','e','g'} +local fmt, spec, desc +for i,letter in ipairs(letters) do + for k,before in ipairs(lengths) do + for j,prefix in ipairs(prefixes) do + spec = '(%'..prefix..before..letter..')' + fmt = spec..'\t'..spec..'\t'..spec..'\t'..spec..'\t'..spec..'\t'..spec + print(spec, string.format(fmt, 12.34, -12.34, 1/11, -1/11, 300/11, -300/11) ) + for l,after in ipairs(lengths) do + spec = '(%'..prefix..before..'.'..after..letter..')' + fmt = spec..' '..spec..' '..spec..' '..spec..' '..spec..' '..spec + print(spec, string.format(fmt, 12.34, -12.34, 1/11, -1/11, 300/11, -300/11) ) + end + end + end +end +--]==] + +local function fmterr(...) + local r, s = pcall(...) + if r then + return s + else + s = string.gsub(s, "stdin:%d+:%s*", "") + return s + end +end + +print(fmterr(string.find, "ab%c)0(", "%")) +print(fmterr(string.find, "ab%c)0(", "(")) +print(pcall(string.find, "ab%c)0(", ")")) diff --git a/luaj-test/src/test/resources/luaj3.0-tests/tablelib.lua b/luaj-test/src/test/resources/luaj3.0-tests/tablelib.lua new file mode 100644 index 00000000..8f99ca71 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/tablelib.lua @@ -0,0 +1,284 @@ +local func = function(t,...) + return (...) +end +local tbl = setmetatable({},{__index=func}) +print( tbl[2] ) + + +-- tostring replacement that assigns ids +local ts,id,nid,types = tostring,{},0,{table='tbl',thread='thr',userdata='uda',['function']='func'} +tostring = function(x) + if not x or not types[type(x)] then return ts(x) end + if not id[x] then nid=nid+1; id[x]=types[type(x)]..'.'..nid end + return id[x] +end + +local t = { "one", "two", "three", a='aaa', b='bbb', c='ccc' } + +table.insert(t,'six'); +table.insert(t,1,'seven'); +table.insert(t,4,'eight'); +table.insert(t,7,'nine'); +table.insert(t,10,'ten'); print( #t ) + +-- concat +print( '-- concat tests' ) +function tryconcat(t) + print( table.concat(t) ) + print( table.concat(t,'--') ) + print( table.concat(t,',',2) ) + print( table.concat(t,',',2,2) ) + print( table.concat(t,',',5,2) ) +end +tryconcat( { "one", "two", "three", a='aaa', b='bbb', c='ccc' } ) +tryconcat( { "one", "two", "three", "four", "five" } ) +function tryconcat(t) + print( table.concat(t) ) + print( table.concat(t,'--') ) + print( table.concat(t,',',2) ) +end +tryconcat( { a='aaa', b='bbb', c='ccc', d='ddd', e='eee' } ) +tryconcat( { [501]="one", [502]="two", [503]="three", [504]="four", [505]="five" } ) +tryconcat( {} ) + +-- print the elements of a table in a platform-independent way +function eles(t,f) + f = f or pairs + all = {} + for k,v in f(t) do + table.insert( all, "["..tostring(k).."]="..tostring(v) ) + end + table.sort( all ) + return "{"..table.concat(all,',').."}" +end + +-- insert, len +print( '-- insert, len tests' ) +local t = { "one", "two", "three", a='aaa', b='bbb', c='ccc' } + +print( eles(t), #t ) +table.insert(t,'six'); print( eles(t), #t ) +table.insert(t,1,'seven'); print( eles(t), #t ) +table.insert(t,4,'eight'); print( eles(t), #t ) +table.insert(t,7,'nine'); print( eles(t), #t ) +table.insert(t,10,'ten'); print( eles(t), #t ) +print( '#{}', #{} ) +print( '#{"a"}', #{"a"} ) +print( '#{"a","b"}', #{"a","b"} ) +print( '#{"a",nil}', #{"a",nil} ) +print( '#{nil,nil}', #{nil,nil} ) +print( '#{nil,"b"}', #{nil,"b"}==0 or #{nil,"b"}==2 ) +print( '#{"a","b","c"}', #{"a","b","c"} ) +print( '#{"a","b",nil}', #{"a","b",nil} ) +print( '#{"a",nil,nil}', #{"a",nil,nil} ) +print( '#{nil,nil,nil}', #{nil,nil,nil} ) +print( '#{nil,nil,"c"}', #{nil,nil,"c"}==0 or #{nil,nil,"c"}==3 ) +print( '#{nil,"b","c"}', #{nil,"b","c"}==0 or #{nil,"b","c"}==3 ) +print( '#{nil,"b",nil}', #{nil,"b",nil}==0 or #{nil,"b",nil}==2 ) +print( '#{"a",nil,"c"}', #{"a",nil,"c"}==1 or #{"a",nil,"c"}==3 ) + +-- remove +print( '-- remove tests' ) +t = { "one", "two", "three", "four", "five", "six", "seven", [10]="ten", a='aaa', b='bbb', c='ccc' } +print( eles(t), #t ) +print( 'table.remove(t)', table.remove(t) ); print( eles(t), #t ) +print( 'table.remove(t,1)', table.remove(t,1) ); print( eles(t), #t ) +print( 'table.remove(t,3)', table.remove(t,3) ); print( eles(t), #t ) +print( 'table.remove(t,5)', table.remove(t,5) ); print( eles(t), #t ) +print( 'table.remove(t,10)', table.remove(t,10) ); print( eles(t), #t ) +print( 'table.remove(t,-1)', table.remove(t,-1) ); print( eles(t), #t ) +print( 'table.remove(t,-1)', table.remove(t,-1) ) ; print( eles(t), #t ) + +-- sort +print( '-- sort tests' ) +function sorttest(t,f) + t = (t) + print( table.concat(t,'-') ) + if f then + table.sort(t,f) + else + table.sort(t) + end + print( table.concat(t,'-') ) +end +sorttest{ "one", "two", "three" } +sorttest{ "www", "vvv", "uuu", "ttt", "sss", "zzz", "yyy", "xxx" } +sorttest( { "www", "vvv", "uuu", "ttt", "sss", "zzz", "yyy", "xxx" }, function(a,b) return b0, returning f2(n-1,n,...)", n-1,n,... ) + return f2(n-1,n,...) +end + +local function f3(n,...) + if n <= 0 then + return sum(...) + end + print( " f3,n-1,n,...", f3,n-1,n,... ) + return pcall(f3,n-1,n,...) +end + +local function all(f) + for n=0,3 do + t = {} + for m=1,5 do + print( "--f, n, table.unpack(t)", f, n, table.unpack(t) ) + print( pcall( f, n, table.unpack(t)) ) + t[m] = m + end + end +end + +all(f1) +all(f2) +all(f3) + + +local function f(x) + -- tailcall to a builtin + return math.abs(x) +end + +local function factorial(i) + local function helper(product, n) + if n <= 0 then + return product + else + -- tail call to a nested Lua function + return helper(n * product, n - 1) + end + end + return helper(1, i) +end + +local result1 = factorial(5) +print(result1) +print(factorial(5)) + +local result2 = f(-1234) +print( result2 ) + +local function fib_bad(n) + local function helper(i, a, b) + if i >= n then + return a + else + -- not recognized by luac as a tailcall! + local result = helper(i + 1, b, a + b) + return result + end + end + return helper(1, 1, 1) +end + +local function fib_good(n) + local function helper(i, a, b) + if i >= n then + return a + else + -- must be a tail call! + return helper(i + 1, b, a + b) + end + end + return helper(1, 1, 1) +end + +local aliases = { + ['1.#INF'] = 'inf', + ['-1.#INF'] = '-inf', + ['1.#IND'] = 'nan', + ['-1.#IND'] = 'nan', +} + +local p = function( s,e ) + print( s, e and aliases[tostring(e)] or e ) +end +p(pcall(fib_bad, 30)) +--p((pcall(fib_bad, 25000))) +p(pcall(fib_good, 30)) +p(pcall(fib_good, 25000)) + +local function fib_all(n, i, a, b) + i = i or 1 + a = a or 1 + b = b or 1 + if i >= n then + return + else + return a, fib_all(n, i+1, b, a+b) + end +end + +print(fib_all(10)) diff --git a/luaj-test/src/test/resources/luaj3.0-tests/upvalues.lua b/luaj-test/src/test/resources/luaj3.0-tests/upvalues.lua new file mode 100644 index 00000000..2c263dd8 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/upvalues.lua @@ -0,0 +1,97 @@ + +print( '-------- simple upvalues tests --------' ) +local function simpleupvalues() + function test() + local x = 5 + function f() + x = x + 1 + return x + end + function g() + x = x - 1 + return x + end + print(f()) + print(g()) + return f, g + end + + f1, g1 = test() + print("f1()=", f1()) + print("g1()=", g1()) + + f2, g2 = test() + print("f2()=", f2()) + print("g2()=", g2()) + + print("g1()=", g1()) + print("f1()=", f1()) +end +print( 'simplevalues result:', pcall( simpleupvalues ) ) + + +-- The point of this test is that when an upvalue is created, it may +-- need to be inserted in the middle of the list, rather than always +-- appended at the end. Otherwise, it may not be found when it is +-- needed by another closure. +print( '----------- upvalued in middle ------------' ) +local function middleupvaluestest() + local function test() + local x = 3 + local y = 5 + local z = 7 + + local function f() + print("y=", y) + end + + local function g() + print("z=", z) + end + + local function h() + print("x=", x) + end + + local function setter(x1, y1, z1) + x = x1 + y = y1 + z = z1 + end + + return f, g, h, setter + end + + local f, g, h, setter = test() + + h() + f() + g() + + setter("x", "y", "z") + + h() + f() + g() +end +print( pcall( middleupvaluestest ) ) + + +print( '--------- nested upvalues ----------' ) +local function nestedupvaluestest() + local f + do + local x = 10 + function g() + print(x, f()) + end + end + + function f() + return 20 + end + + g() +end +print( 'nestedupvaluestest result:', pcall( nestedupvaluestest ) ) + diff --git a/luaj-test/src/test/resources/luaj3.0-tests/vm.lua b/luaj-test/src/test/resources/luaj3.0-tests/vm.lua new file mode 100644 index 00000000..25e13bec --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/vm.lua @@ -0,0 +1,250 @@ + +print( '-------- basic vm tests --------' ) + +print( '-- boolean tests' ) +local function booleantests() + t = true + f = false + n = nil + s = "Hello" + z = 0 + one = 1 + + print(t) + print(f) + + print(not t) + print(not f) + print(not n) + print(not z) + print(not s) + print(not(not(t))) + print(not(not(z))) + print(not(not(n))) + + print(t and f) + print(t or f) + print(f and t) + print(f or t) + + print(f or one) + print(f or z) + print(f or n) + + print(t and one) + print(t and z) + print(t and n) +end +print( 'booleantests result:', pcall( booleantests ) ) + + +print( '------------- varargs' ) +local function varargstest() + function p(a,...) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) + end + function q(a,...) + print("a,arg[1],arg[2],arg[3]",a,arg.n,arg[1],arg[2],arg[3]) + end + function r(a,...) + print("a,arg[1],arg[2],arg[3]",a,arg.n,arg[1],arg[2],arg[3]) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) + end + function s(a) + local arg = { '1', '2', '3' } + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) + end + function t(a,...) + local arg = { '1', '2', '3' } + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) + end + function u(arg) + print( 'arg', arg ) + end + function v(arg,...) + print( 'arg', arg ) + print("...",...) + print("arg,...",arg,...) + end + arg = { "global-1", "global-2", "global-3" } + function tryall(f,name) + print( '---- function '..name..'()' ) + print( '--'..name..'():' ) + print( ' ->', pcall( f ) ) + print( '--'..name..'("q"):' ) + print( ' ->', pcall( f, "q" ) ) + print( '--'..name..'("q","r"):' ) + print( ' ->', pcall( f, "q", "r" ) ) + print( '--'..name..'("q","r","s"):' ) + print( ' ->', pcall( f, "q", "r", "s" ) ) + end + tryall(p,'p') + tryall(q,'q') + tryall(r,'r') + tryall(s,'s') + tryall(t,'t') + tryall(u,'u') + tryall(v,'v') +end +print( 'varargstest result:', pcall( varargstest ) ) + +-- The purpose of this test case is to demonstrate that +-- basic metatable operations on non-table types work. +-- i.e. that s.sub(s,...) could be used in place of string.sub(s,...) +print( '---------- metatable tests' ) +local function metatabletests() + + -- tostring replacement that assigns ids + local ts,id,nid,types = tostring,{},0,{table='tbl',thread='thr',userdata='uda',['function']='func'} + tostring = function(x) + if not x or not types[type(x)] then return ts(x) end + if not id[x] then nid=nid+1; id[x]=types[type(x)]..'.'..nid end + return id[x] + end + local results = function(s,e,...) + if s then return e,... end + return false,type(e) + end + local pcall = function(...) + return results( pcall(...) ) + end + + + local s = "hello" + print(s:sub(2,4)) + + local t = {} + function op(name,...) + local a,b = pcall( setmetatable, t, ... ) + print( name, t, getmetatable(t), a, b ) + end + op('set{} ',{}) + op('set-nil',nil) + op('set{} ',{}) + op('set') + op('set{} ',{}) + op('set{} ',{}) + op('set{}{}',{},{}) + op('set-nil',nil) + op('set{__}',{__metatable={}}) + op('set{} ',{}) + op('set-nil',nil) + t = {} + op('set{} ',{}) + op('set-nil',nil) + op('set{__}',{__metatable='abc'}) + op('set{} ',{}) + op('set-nil',nil) + + + local i = 1234 + local t = setmetatable( {}, { + __mode="v", + __index=function(t,k) + local v = i + i = i + 1 + rawset(t,k,v) + return v + end, + } ) + + local l = { 'a', 'b', 'a', 'b', 'c', 'a', 'b', 'c', 'd' } + for i,key in ipairs(l) do + print( 't.'..key, t[key] ) + end +end +print( 'metatabletests result:', pcall( metatabletests ) ) + +-- test tables with more than 50 elements +print( '------------ huge tables' ) +local function hugetables() + local t = { 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + } + print ("#t=",#t,'t[1,50,51,59]', t[1], t[50], t[51], t[59]) + print (table.concat(t,',')) + + local t2= { 0,3,4,7,9,8,12,15,23,5, + 10,13,14,17,19,18,112,115,123,15, + 20,33,24,27,29,28,212,215,223,25, + 40,43,44,47,49,48,412,415,423,45, + 50,53,54,57,59,58,512,515,523,55, + 60,63,64,67,69,68,612,615,623,65, + 70,73,74,77,79,78,72,715,723,75, + } + + print ("#t2=",#t2,'t[1,50,51,59]', t[1], t[50], t[51], t[59]) + print (table.concat(t2,',')) + + local t = { + [2000]='a', [2001]='b', [2002]='c', [2003]='d', [2004]='e', [2005]='f', [2006]='g', [2007]='h', [2008]='i', [2009]='j', + [3000]='a', [3001]='b', [3002]='c', [3003]='d', [3004]='e', [3005]='f', [3006]='g', [3007]='h', [3008]='i', [3009]='j', + [4000]='a', [4001]='b', [4002]='c', [4003]='d', [4004]='e', [4005]='f', [4006]='g', [4007]='h', [4008]='i', [4009]='j', + [5000]='a', [5001]='b', [5002]='c', [5003]='d', [5004]='e', [5005]='f', [5006]='g', [5007]='h', [5008]='i', [5009]='j', + [6000]='a', [6001]='b', [6002]='c', [6003]='d', [6004]='e', [6005]='f', [6006]='g', [6007]='h', [6008]='i', [6009]='j', + [7000]='a', [7001]='b', [7002]='c', [7003]='d', [7004]='e', [7005]='f', [7006]='g', [7007]='h', [7008]='i', [7009]='j', + [8000]='a', [8001]='b', [8002]='c', [8003]='d', [8004]='e', [8005]='f', [8006]='g', [8007]='h', [8008]='i', [8009]='j', + } + + for i=2000,8000,1000 do + for j=0,9,1 do + print( 't['..tostring(i+j)..']', t[i+j] ) + end + end +end +print( 'hugetables result:', pcall( hugetables ) ) + +print( '--------- many locals' ) +local function manylocals() + -- test program with more than 50 non-sequential integer elements + local t0000='a'; local t0001='b'; local t0002='c'; local t0003='d'; local t0004='e'; local t0005='f'; local t0006='g'; local t0007='h'; local t0008='i'; local t0009='j'; + local t1000='a'; local t1001='b'; local t1002='c'; local t1003='d'; local t1004='e'; local t1005='f'; local t1006='g'; local t1007='h'; local t1008='i'; local t1009='j'; + local t2000='a'; local t2001='b'; local t2002='c'; local t2003='d'; local t2004='e'; local t2005='f'; local t2006='g'; local t2007='h'; local t2008='i'; local t2009='j'; + local t3000='a'; local t3001='b'; local t3002='c'; local t3003='d'; local t3004='e'; local t3005='f'; local t3006='g'; local t3007='h'; local t3008='i'; local t3009='j'; + local t4000='a'; local t4001='b'; local t4002='c'; local t4003='d'; local t4004='e'; local t4005='f'; local t4006='g'; local t4007='h'; local t4008='i'; local t4009='j'; + local t5000='a'; local t5001='b'; local t5002='c'; local t5003='d'; local t5004='e'; local t5005='f'; local t5006='g'; local t5007='h'; local t5008='i'; local t5009='j'; + local t6000='a'; local t6001='b'; local t6002='c'; local t6003='d'; local t6004='e'; local t6005='f'; local t6006='g'; local t6007='h'; local t6008='i'; local t6009='j'; + local t7000='a'; local t7001='b'; local t7002='c'; local t7003='d'; local t7004='e'; local t7005='f'; local t7006='g'; local t7007='h'; local t7008='i'; local t7009='j'; + local t8000='a'; local t8001='b'; local t8002='c'; local t8003='d'; local t8004='e'; local t8005='f'; local t8006='g'; local t8007='h'; local t8008='i'; local t8009='j'; + local t9000='a'; local t9001='b'; local t9002='c'; local t9003='d'; local t9004='e'; local t9005='f'; local t9006='g'; local t9007='h'; local t9008='i'; local t9009='j'; + local t10000='a'; local t10001='b'; local t10002='c'; local t10003='d'; local t10004='e'; local t10005='f'; local t10006='g'; local t10007='h'; local t10008='i'; local t10009='j'; + local t11000='a'; local t11001='b'; local t11002='c'; local t11003='d'; local t11004='e'; local t11005='f'; local t11006='g'; local t11007='h'; local t11008='i'; local t11009='j'; + local t12000='a'; local t12001='b'; local t12002='c'; local t12003='d'; local t12004='e'; local t12005='f'; local t12006='g'; local t12007='h'; local t12008='i'; local t12009='j'; + local t13000='a'; local t13001='b'; local t13002='c'; local t13003='d'; local t13004='e'; local t13005='f'; local t13006='g'; local t13007='h'; local t13008='i'; local t13009='j'; + + -- print the variables + print(t0000,'a'); print(t0001,'b'); print(t0002,'c'); print(t0003,'d'); print(t0004,'e'); print(t0005,'f'); print(t0006,'g'); print(t0007,'h'); print(t0008,'i'); print(t0009,'j'); + print(t1000,'a'); print(t1001,'b'); print(t1002,'c'); print(t1003,'d'); print(t1004,'e'); print(t1005,'f'); print(t1006,'g'); print(t1007,'h'); print(t1008,'i'); print(t1009,'j'); + print(t2000,'a'); print(t2001,'b'); print(t2002,'c'); print(t2003,'d'); print(t2004,'e'); print(t2005,'f'); print(t2006,'g'); print(t2007,'h'); print(t2008,'i'); print(t2009,'j'); + print(t3000,'a'); print(t3001,'b'); print(t3002,'c'); print(t3003,'d'); print(t3004,'e'); print(t3005,'f'); print(t3006,'g'); print(t3007,'h'); print(t3008,'i'); print(t3009,'j'); + print(t4000,'a'); print(t4001,'b'); print(t4002,'c'); print(t4003,'d'); print(t4004,'e'); print(t4005,'f'); print(t4006,'g'); print(t4007,'h'); print(t4008,'i'); print(t4009,'j'); + print(t5000,'a'); print(t5001,'b'); print(t5002,'c'); print(t5003,'d'); print(t5004,'e'); print(t5005,'f'); print(t5006,'g'); print(t5007,'h'); print(t5008,'i'); print(t5009,'j'); + print(t6000,'a'); print(t6001,'b'); print(t6002,'c'); print(t6003,'d'); print(t6004,'e'); print(t6005,'f'); print(t6006,'g'); print(t6007,'h'); print(t6008,'i'); print(t6009,'j'); + print(t7000,'a'); print(t7001,'b'); print(t7002,'c'); print(t7003,'d'); print(t7004,'e'); print(t7005,'f'); print(t7006,'g'); print(t7007,'h'); print(t7008,'i'); print(t7009,'j'); + print(t8000,'a'); print(t8001,'b'); print(t8002,'c'); print(t8003,'d'); print(t8004,'e'); print(t8005,'f'); print(t8006,'g'); print(t8007,'h'); print(t8008,'i'); print(t8009,'j'); + print(t9000,'a'); print(t9001,'b'); print(t9002,'c'); print(t9003,'d'); print(t9004,'e'); print(t9005,'f'); print(t9006,'g'); print(t9007,'h'); print(t9008,'i'); print(t9009,'j'); + print(t10000,'a'); print(t10001,'b'); print(t10002,'c'); print(t10003,'d'); print(t10004,'e'); print(t10005,'f'); print(t10006,'g'); print(t10007,'h'); print(t10008,'i'); print(t10009,'j'); + print(t11000,'a'); print(t11001,'b'); print(t11002,'c'); print(t11003,'d'); print(t11004,'e'); print(t11005,'f'); print(t11006,'g'); print(t11007,'h'); print(t11008,'i'); print(t11009,'j'); + print(t12000,'a'); print(t12001,'b'); print(t12002,'c'); print(t12003,'d'); print(t12004,'e'); print(t12005,'f'); print(t12006,'g'); print(t12007,'h'); print(t12008,'i'); print(t12009,'j'); + print(t13000,'a'); print(t13001,'b'); print(t13002,'c'); print(t13003,'d'); print(t13004,'e'); print(t13005,'f'); print(t13006,'g'); print(t13007,'h'); print(t13008,'i'); print(t13009,'j'); +end +print( 'manylocals result:', pcall( manylocals ) ) diff --git a/luaj-test/src/test/resources/perf/binarytrees.out b/luaj-test/src/test/resources/perf/binarytrees.out new file mode 100644 index 00000000..72654db9 --- /dev/null +++ b/luaj-test/src/test/resources/perf/binarytrees.out @@ -0,0 +1,4 @@ +stretch tree of depth 7 check: -1 +128 trees of depth 4 check: -128 +32 trees of depth 6 check: -32 +long lived tree of depth 6 check: -1 diff --git a/luaj-test/src/test/resources/perf/fannkuch.out b/luaj-test/src/test/resources/perf/fannkuch.out new file mode 100644 index 00000000..3ae262f1 --- /dev/null +++ b/luaj-test/src/test/resources/perf/fannkuch.out @@ -0,0 +1,2 @@ +1 +Pfannkuchen(1) = 0 diff --git a/luaj-test/src/test/resources/perf/nbody.out b/luaj-test/src/test/resources/perf/nbody.out new file mode 100644 index 00000000..1731557c --- /dev/null +++ b/luaj-test/src/test/resources/perf/nbody.out @@ -0,0 +1,2 @@ +-0.169075164 +-0.169087605 diff --git a/luaj-test/src/test/resources/perf/nsieve.out b/luaj-test/src/test/resources/perf/nsieve.out new file mode 100644 index 00000000..bbcb938c --- /dev/null +++ b/luaj-test/src/test/resources/perf/nsieve.out @@ -0,0 +1,3 @@ +Primes up to 20000 2262 +Primes up to 10000 1229 +Primes up to 5000 669 diff --git a/luaj-test/src/test/resources/regressions-mingw/bigattr.lua b/luaj-test/src/test/resources/regressions-mingw/bigattr.lua new file mode 100644 index 00000000..48902056 --- /dev/null +++ b/luaj-test/src/test/resources/regressions-mingw/bigattr.lua @@ -0,0 +1,2 @@ +a = {} +a[2^31] = 10; a[2^31+1] = 11; a[-2^31] = 12; diff --git a/luaj-test/src/test/resources/regressions-mingw/comparators.lua b/luaj-test/src/test/resources/regressions-mingw/comparators.lua new file mode 100644 index 00000000..a60f4c0e --- /dev/null +++ b/luaj-test/src/test/resources/regressions-mingw/comparators.lua @@ -0,0 +1,3 @@ +while i ~= f do + i,v = next(self, i) +end diff --git a/luaj-test/src/test/resources/regressions-mingw/construct.lua b/luaj-test/src/test/resources/regressions-mingw/construct.lua new file mode 100644 index 00000000..de4ff406 --- /dev/null +++ b/luaj-test/src/test/resources/regressions-mingw/construct.lua @@ -0,0 +1 @@ +x = {f'alo'} diff --git a/luaj-test/src/test/resources/regressions-mingw/controlchars.lua b/luaj-test/src/test/resources/regressions-mingw/controlchars.lua new file mode 100644 index 00000000..d53fb3b7 --- /dev/null +++ b/luaj-test/src/test/resources/regressions-mingw/controlchars.lua @@ -0,0 +1,2 @@ +print( '\a\n >>> testC not active: skipping API tests <<<\n\a' ) +print( '\a\b\f\n\r\v\\\'\"' ) \ No newline at end of file diff --git a/luaj-test/src/test/resources/regressions-mingw/mathrandomseed.lua b/luaj-test/src/test/resources/regressions-mingw/mathrandomseed.lua new file mode 100644 index 00000000..c83201b6 --- /dev/null +++ b/luaj-test/src/test/resources/regressions-mingw/mathrandomseed.lua @@ -0,0 +1 @@ +math.randomseed(0) diff --git a/luaj-test/src/test/resources/regressions-mingw/modulo.lua b/luaj-test/src/test/resources/regressions-mingw/modulo.lua new file mode 100644 index 00000000..b0203a3b --- /dev/null +++ b/luaj-test/src/test/resources/regressions-mingw/modulo.lua @@ -0,0 +1,4 @@ +a=4%3 +b=-4%3 +c=4%-3 +d=-4%-3 diff --git a/luaj-test/src/test/resources/regressions-mingw/varargs.lua b/luaj-test/src/test/resources/regressions-mingw/varargs.lua new file mode 100644 index 00000000..2d0d04bb --- /dev/null +++ b/luaj-test/src/test/resources/regressions-mingw/varargs.lua @@ -0,0 +1,29 @@ +function p(a,...) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) +end +function q(a,...) + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) +end +function r(a,...) + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) +end +function s(a) + local arg = { '1', '2', '3' } + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) +end +function t(a,...) + local arg = { '1', '2', '3' } + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) +end diff --git a/luaj-test/src/test/resources/regressions/bigattr.lc b/luaj-test/src/test/resources/regressions/bigattr.lc new file mode 100644 index 0000000000000000000000000000000000000000..fd8c2561a98268769162e58dcc49037e644af658 GIT binary patch literal 230 zcmb34DNPJwU}WK7;b4%Q%*!Rk#Q+10Oq@U_HxP3$Ff_0+I52QE9DvXa2OA;$gH7@b z4Gio+H7ra}eTfXr5Y_`nC_}{o$WQ4_yJ iMS3}1F#rJeb`?ti literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/regressions/bigattr.lua b/luaj-test/src/test/resources/regressions/bigattr.lua new file mode 100644 index 00000000..48902056 --- /dev/null +++ b/luaj-test/src/test/resources/regressions/bigattr.lua @@ -0,0 +1,2 @@ +a = {} +a[2^31] = 10; a[2^31+1] = 11; a[-2^31] = 12; diff --git a/luaj-test/src/test/resources/regressions/comparators.lc b/luaj-test/src/test/resources/regressions/comparators.lc new file mode 100644 index 0000000000000000000000000000000000000000..45fdb8754cafd2a428fb6058ab66a83300a9b5f1 GIT binary patch literal 254 zcmb34DNPJwU}WK7;b4%Q%*!Rk#Q+10%sfCQ8-oLbn}Y*GgaZSEcmrbt+W{b-!I7a2 zC@y=Tfsw<3p^<}up+TJCZ@oN20|P5i4+|5J0D(*dGY!EkV_*TP0)f2LiV_5`I5j5? zEX)Wb85sn@Yz790sC5H!e2T$mYZ5J(Tq=6F}XFa`jo CaT!Da literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/regressions/comparators.lua b/luaj-test/src/test/resources/regressions/comparators.lua new file mode 100644 index 00000000..a60f4c0e --- /dev/null +++ b/luaj-test/src/test/resources/regressions/comparators.lua @@ -0,0 +1,3 @@ +while i ~= f do + i,v = next(self, i) +end diff --git a/luaj-test/src/test/resources/regressions/construct.lc b/luaj-test/src/test/resources/regressions/construct.lc new file mode 100644 index 0000000000000000000000000000000000000000..3e6334d9a39e4e6d655f1cd6e831a631752094a6 GIT binary patch literal 186 zcmb34DNPJwU}WK7;b4%Q%*!Rk#Q+10%Pldv7=a`sgAmkMhvfXclA`>a1F#rH|5Flj$ literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/regressions/controlchars.lua b/luaj-test/src/test/resources/regressions/controlchars.lua new file mode 100644 index 00000000..d53fb3b7 --- /dev/null +++ b/luaj-test/src/test/resources/regressions/controlchars.lua @@ -0,0 +1,2 @@ +print( '\a\n >>> testC not active: skipping API tests <<<\n\a' ) +print( '\a\b\f\n\r\v\\\'\"' ) \ No newline at end of file diff --git a/luaj-test/src/test/resources/regressions/mathrandomseed.lc b/luaj-test/src/test/resources/regressions/mathrandomseed.lc new file mode 100644 index 0000000000000000000000000000000000000000..d7c4e7a1901abc81b302287ec9cfd35c5bb78ffe GIT binary patch literal 183 zcmb34DNPJwU}WK7;b4%Q%*!Rk#Q+10OsqgA8-oJ_yMqIRV*>+&tOEn1JVOHmGf<5{_2*x}R;}{%r^HWN5^7V2`6B$4* Z0m*_a1zE=e#Xt%y4w46fcvrtL1^^(46QTeB literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/regressions/modulo.lua b/luaj-test/src/test/resources/regressions/modulo.lua new file mode 100644 index 00000000..b0203a3b --- /dev/null +++ b/luaj-test/src/test/resources/regressions/modulo.lua @@ -0,0 +1,4 @@ +a=4%3 +b=-4%3 +c=4%-3 +d=-4%-3 diff --git a/luaj-test/src/test/resources/regressions/varargs.lc b/luaj-test/src/test/resources/regressions/varargs.lc new file mode 100644 index 0000000000000000000000000000000000000000..4f85986498367129110ea4d38c1b5ced201f6f66 GIT binary patch literal 2173 zcmcgt%Wl&^6uslPi76Dyo3@~?%qoi1_5+wKXcr(BEZCq3jf6l*2$i&DZL?@UpzHpN zz2Z;0<`X#QPW(<#5QS+^=DzGZbMBq-*2@$3T1*&)k!+l=t!}PLF-&kBVhltgNo+YM zNt~#j#+mAAEQbE?+mgr%V#5GG9EX+owGyY5cvOkU`l!KEeZZKNyO{RHN@_(i$P=3w z)f16R)n|S(mlZ=~nt}pa%ry5Y-dajn$G!ptj7H=!3WEwarE=x%;nWy1GvSIpl@f#v|Ak zVFSK8Hlf$C1-*^Ou(iQ5b~}M9YIg!{olc;^%>U5ws^F)CAv{d{0`W-m>SO=0vzWbT JCWzhl{{n*j)JOmT literal 0 HcmV?d00001 diff --git a/luaj-test/src/test/resources/regressions/varargs.lua b/luaj-test/src/test/resources/regressions/varargs.lua new file mode 100644 index 00000000..2d0d04bb --- /dev/null +++ b/luaj-test/src/test/resources/regressions/varargs.lua @@ -0,0 +1,29 @@ +function p(a,...) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) +end +function q(a,...) + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) +end +function r(a,...) + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) +end +function s(a) + local arg = { '1', '2', '3' } + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) +end +function t(a,...) + local arg = { '1', '2', '3' } + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) +end diff --git a/luaj-test/test/lua/luaj3.0-tests.zip b/luaj-test/test/lua/luaj3.0-tests.zip deleted file mode 100644 index 40b70f0281b64829cacc25e795a12f6a9d97975c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323550 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�P&G(>$05E>-P#%+rv{Y&r%qy9I{;?ZPC` zEQ+u9`7`+L z>#&s49!%BHcLf1e`LUU<-BQ&K(kx}zjhAMN_00~`ZvCK0H~cQ`6i$1q)w4iHo=gZL zRgy|QWrwKrl4wB{c;V4k$0@N$L0oh5? z-GtgKZT)yg5?F>u_j!A@AG4ZHDo%ePWqpA4e6W2f3+`OrCjHO>9$TMgz=)_vE}{4>b1@w zFjxx(;b1VAwSYOR^BTZh_JSuYE_(rV*z=+=I;;g#;I5iNY0%nJysB;LE(aG>dt-8b zl`eJaJ=NaI@k`c-rjYNJ_Q zOiRcC%GCfhJ?3w5cT^_y(eII()?xre9oAS7C0R2^juS;0S+hpoeHc&0EfSMSx$z*fNf$3Cmwg=MngOx2OliUDPrEMcqHn0j!dT zMI0j_^76Po0}0;%cXi>OZwPOv>v(Qi9pm^dn!#T(yJX<;nK;iGI2Os_ym?gy?9`;Q zMuOQ&E1SHO^X?-&?I#%@%M!et@tBvYcaa|Tx2FYkn^s47aVh00{CQ1(+{j(Fz6CVg z#ajqtj5TJ8MjJ1E*}5Q?TKksQWpB)er)P1+JcfuWYDTl(SLh+A$|Z^_2s{?`u-tjmzg19*?Nxd>hP5uBzjo-XFyjziQ!%{}q zz>B!-Y5wu66U(~s?99DZ78z{&v{TaOKpw0qz_BJ~m!nczjJ7S zE^YPpAC{$)GY2d%Ha59N6!eAEt96U8K=$Qp(;{HB%}HL%)p-H?NX=pJMReSKI;2K` z^vGKY2e(V5y_gR`dI&A6o#@^2oF>j}! zHHAaiD5qF#* z?p)2H4I^`K*C%m}bT4&H4!KkoP7pXOyq{11`^fC?JG7pzua|#5XK5!%%e7K8%H@2HD%2O>_mqhKfY~G(FV%xE~)P2XkfS+;si__JzV?&$8_5OWZl2>VuLm#E=^oo67ok?E&0J7(r<)7k@?(Ok(0B8D9PSC$Qf> ze}+w2=(20XGTzBOEb45zlKnIggWjR1q>-hcPa@@_V|u`jsWwuuuOOZt;}H7u8FctF zh|gD0J6{j|0(6&}i@c>r9Fwnr{9TV1*U@99XW#p$umkqwWt(soXZMkF$NgT$!TQJ} zAY|aCF|8xit6{y)+e>3CM&L;g)9RC(23H_ro9f0eBRbB}0K9@<<@qMK<#vD@*(-rJ z;kwA1wFdKrT#U5Nyw&k@cFAnE%-6;~@6EAxaJ&V~y#>sFbbY_LZ*P(7+PYrt#9DRy zFZ_S=qS#I??n6-hjXV$l05^1ie?kBUz|_gf-pTp@^?xPfPo@5Y|GTQ88=uXE;A`g> zO8*7W5|CxnPLKK}uBK`_FiG@)$S5X-deZN1103ifqqIx?(zbd#_R2YK&SPwhG%nLd z(A~t@AcsSp7p=vTH0e%<2~Gk3&!Y*DT|MnFLMm#C!1_+)j|bA=YAk*t{lv*7ou^9t zWUBs_=yMN3-|)Emt^i*|)p=aGgT58F|LwDP(rko)T2b;91Is_`kz0{{Zl*XB9M_${!!)k$TIPsum z{{MV!RN(<(To+J}^jV-p&WLI48^RY<6Z~A09IDUiJ&aj^xLv^vqIBIMm237Z~?d*}VJZL$*uR()r?I~p^j zFNKI9lwd_;f(>5`9`7w_WSZxhK^SBM*RVdz267aXq`)hFw%}5RP^B?jjaMIH@yQgB zN1sBnhc`KjTgah3;D(|Tx3&yBr07vy z{5j@k8W{P!+=t0xVj}*>q8dtMcTpI5xJCZx0KfChC&r_1zDz+l+rAF1`k9iUc{;u) z2iG7u;g;JafU&^(+Dntm20PT7)y7rbXv8m>Q)?HRe18$ z>(d1l>8?kIJfOdv*=*pAf%rb(qWwY4{PGg!#?m*^1$b>eT;!xs9 z$cQ$Z;y~g==&)TWC~K2A>#7Zh)X78T5X?gFkoFZf8voAg`@uM<{A@bk{hMEF<=`rz zf8fGD`FB)Z$bau!zoGAQ&vU%2FYC8k;qGA-H^scOoi3OHU-9>lGx;It;Wl9YajmEJ zn_0FfJMd#`QaHvuHy_M!%Iv)kfv}7hg5JDZOYeGGN~FeORX+^Ax(h@h9cwl0D*6cm zwx@>oIbkBX1r}y7abug6nVFABoIt!$|9^M5^LETTE+7B^$A9V%_FsoHbG0*ev9!1Q z|7>!xs@rwh3L&BkaF za{0EbI(D=3lQ0RHaR`sP1m~y`OtGdQ#Nfgd>Jp}j8loDk zhKNI-SaKuf=C?@zO_&DNh#3qoP z$f%&2B+ z)_F4V;=~Q{j;`miGVCcL?(K{7=5ath%&)2?qjSxW1wg7GQTk z7k6%^jWlQNYtz!6+LkaE_;Lmdrjge`33HU0|5qCHHbxeY8Cke!CZ6(3=Xa+bn`*By zDh?G{bXR9MwZ!s@bds<#6sC{?iXe{x5j@~R+FN*(uqL@`CTqKv?DgZZ!~(Ir?BW^WUdI%f$?$f3m8qFi7DVs*-euJWf7{gw(=iRJteoJ(Nb(l)Gb+Kti&#m@%+=bTFpRX?7GhDfn*?gUM-Q88rUU=DhNPHsKD0d+eP zpI_IvZD+t&*MasL|27PM3~N|dD)FILXx`_AQ+Ji!*NFv+-?&QBd*~g|%GG|xw&ys@ zIfgDVgh$Y}?64+Y-gtojFZ~d{AN5&!;e~x3RS%QjfKtfgz*HHmDTwDyuBDc*Xld1J zCd?1K{`W?T<~xEY7Ys)ebC3vcfm`5;s+zUiS4ZwH!21m3&EDoO-i1MkV)CPD|dm5&3D)7kX} zof9kVS-zrYyJGNyeP@<0Ur>bsQbGP#XkKc}bLUtb$;6^!TH+4?(e#>h@x-wD?pFG1w#jVV+_5pC4ceh zg$(S4-0nD*<&}j>D)SF<#mdW@QLd6T=#jFJ8M33u-GSMh^(SyL=Ra}AfJ|R;F7V$v z?wO&dVQ8-M4Qyb)?uFM-P2}T+^;dqe6-3n!Bztvg*6ab~tIh3*xnFwPVs&_vWfxFm zX<*Y^2SXOk;@BkX>T!Xq5G?sxyW}GP#sk*OoVCPub?;X5ASS(J1dW@{7}JC~j2Op> zaTq;wr%$jubo$WKNjf_jSse!Qr)ufHeWK^C-{fWhQ$dJi|1L7Wg&OY}^$l+A-6XbJ zRd!NxE<0_GvFz?qHKc%?BRXg|&vBrO1C5L#ILrkzZu!7!us|a4hFx%ni&nZbc`}YE zJ~;(`#^huyzu`nH-I>hkc&aJ$tZsQgMSf}?RrxhHhpn*)w9W|V*6>}6X(YumSqN0s zZB6!#=F1f|ubz8D?-4*gM5C9*+8zMm9O|Q@Jpd6{A-1VqX^e?#}qYX_38AS17`u&27z+&I*MLB)g%g#*4A_oHo zgmdUcbf!Q4FbX3;yy8;Y5o}!-SCWZC!OSStml;r^RRg)PDN+cNC`8pjX969P+=@W! zmlRWqM%ZE-Ldbr3OA6T~;Fs!`tjl@b}^@~o) z9xOIx4%%Z&Xotsz>x=hs-S@+^w3_FpKkhdhSABVMw#iHpm^A3k32wE+u*l?2#g45n zSb4wV5m#8VpQUBh!6*`tbyeDjNBKAQI1`uq_POJlb zXgp<-$GEB=!2gCMtu+mgXm9`kg@3B=zs7!S4P7k$e}GaihPC}R+kNv7H3T|nX{-|I zrd>DfZ9?ruLZNFE$qk#w-oS=TjZhkoq+AZnh5a8~d?eH9izr?s38K5Wx6_AnlI(|& z8YDeEvyY^hh`TS{dF>NNEv^tO5L4FJ?He*DRCy!42q3hd%^MjDfpTIm2lB^jP*aF| zHv&p|Qiwh*r1Es6rYR`+F|$&@^1~^h@ZaL2hiW!2=;fy4lQac;bgw@*7S(&P@_T*! zK0mkTFtEgW$MBdvn2;EO?K!U$L6-8dE9?sRyvY_$_ByP7Z>QbG%kAOg<>phm{zUZw zJIzudc>o+Eh)Dn}NecB?q4I_#f*g-TvXqzv7~qANB4+!W1O@Tm6Eq6KqfAK*$Lr=L z^sN;%9Nhf8cz+if3YgdglodT~*{>G;V42{cQl()U9`ggK(|q;0mEc*43)<;TM7wHMQ`T-3%irQUt!l1B(hi9sC& zbvLd_%+^WdBzq1W^*BPMPcaR+PL35nOgTWs))`PQdZObG3@nGRGVj`wH!54hN1`lb z8?86_9Bor%D{+f{9)9ni@1Mh)x0Es30hbZ+-c_OCurF+!6cFFeor8x-nG)u$FAM9H zshif1+|&?`k-`Y0iy~gWe3eNJP6tyw1C}+JFeWgCN$d*0wi52-$IQ>dkDOJsaGkBB3N?)dvSm#jZT15KC_$se;PFLZPYC*FGt}Bs&o(Cq+BwlnX|G;#|7GGf&}gcR{)VU{k_=lhT_*l^HH&@Vo=xR*n5XL$72;7N50211LddV>yPF zIUS!5jeHLr(3;BY?zquGrZ7tDqW=i3Ro+aI*Kw{uM2Nwa+NX_IBS8n@#lk?OajQ%h z_r)K#-eoNDO}_6eLSqz42uC_u6w<86rXsavO0$FhSp7 zYL1P@q!dv^*IBOiT*@1XCf%!;TnQy6V#Q)nCR28J9tfXuk=z3xDya;M31)GN#Hl$# zW4R{^_gU#iVb2o^pVI+!h9-9}111hGTWn}t!cN+gYz6Ub2J);SxQx)FIk{(MR#kblp06GULb~33xkyWT zg7_Qs3~uBYM76FVqd7~YbMYbu;9Qqx z>6Bm zu|KCpPOW<#Dxozj>_+1^F#uqFY)Y@dlVtw_li=wb5fv!uFZWD)d#$c&JclAUlSAn& zj|aFH3y{fhMn0(RH3({Hn3K1NOrxg11*q(tZ=kz`r|K1Q*fpAU_CjevH}?EA5T+hisN6a<*e@-sL!(n0Fk zBLbDexZw|Mw~c+kxo27$^M&CSom&Q6dIFB(-yK5`#Rv-L$4Er*V+<{an*+=;A*d%Rv-IH5OqG9huG z^yeg3rDG{x{m5pjT zCImF@7#i6K(TsJl#VTS*i$zps8EIh!TR6EM89$L|klU6urH%@TjH8I!W1ym=W-6=< z6w>Itz@#Yh%cEYtdHHdPVG2UQ7=9%E+BWzPThkZo43-jef!?lL)EG;PMiPM%NE*RF zmspdiwJ{?q4G?2?5Y(K1%y`uwox~;lcoMGS`#)I@3S9!v>pRFjya2>kRH(0{Zg7CuRo2jRE^Z?}iQx(FnrH#=JcFMYyqM`%ftkKZ4UdXx}fi!%ie4cC=$lQrU>ESREy@hSr4AvB35k~g*Z2>ncqXy zNdE#+O~G-ll9Yg{rJzkrB2`d>3pfaT8ymRD7)1n-tzT;yfNn&$Ee-Z7RFGhv zk_RiHhLR)VebEHVT7ei_L>9d2S+-F8=WiK31=z1h@2oB1DeWZm#^{BJ!j>xmJp`#1l`b<95a+s*6~k^TL(?PhXt+k68Y65VE= z4mJWv?OPYV;rtQ_$x1W?8ypan{qg4u$Jdb9wVULzY09{F7i1*XX#+_MxeA9ngMtkp z(_d*i68FUbQavJ%2O=OLLyfX5pv-_tU`EI06N+6F!QiafWZg?4CupZaGR5TQQJ4tAx6AzUZ>U& z@zNup18lm&J;#RdLd5E^_*=DbdG<~7CF>3dFFsJOlX*g*-VXsO4e1@!ggl22gukN^ z;QiNt547F_Jkxjx{Z0fU)m&^_PVYCUihU0ZrJ+~{GrzV@*fV!$-NS!|1&tc>St|>e z#T{gpP!VK|yIFm2+!u1@C_l0EB9%FMw{ptVvzODWXD_B#PoICRoIm|qIeq)Ka`^7% zE6)Ho&fxY>$+<2#yaMe!cWipJ@z|kn)5d4{x=$RN`~Is`{jW5A@vlVJb>jHv1z1N^ za}By{X65-IrsW%_;ltOFIYx}&HK|UaQ$TJ0;lgHov6kE&&&&WKy01DYh{n4zVANqU z7HX%iFlqf4Znq9Sn)U!5qc;YG7^U zbLsEd(D5#^wB7hDLSshu6wWzJDuJ7F5O8iaS(Y|^T1hl$rG%iix*NfG!OuuI^1B02 zx*HJBg)gRRo?yTI+Aq@-Pw=m5ZVVOUg?oGgBDlQ7B@j9RNk3$}$=P-&OqEO^I@9?O zAw9$~6j+LtrRMQNBld0V@Fx1zLvjo~&0~R(&fb3Nq<0!0lNLL;2 z_x(M=K~QxCtTC#PHd22h5>sH|)HnihyvFQupYmJc!O96kV6nKfeH`0o7fnM95{sgQ zYs;(rzD+)|Mk|q{)pa^Z7BVWUL-yiVbkrt}1fc(Gi3|n^Fi1MCOcBAkRP)+pC>&!c zmW#D{#Yf06BZ!?LyRelLUp8SY?FAryk?iR;bj^|3g`9JK4`JNoYvD^^uy-t{fJ^>z z+rIL0Zoh3g79ExY-VT==e~cTzt>W^9<8nh%M&t0`|3=MO-CLp3peYc9;pn4bOqwVYnz+aw{9jRul8V zhQEALZOG)d!FB@J~?MB2>hF>}gtYb(>_vy8b zLyr)pN?@1{nZjeFD-+U9RFe2{6Ui%bX$jiGOs^6cN#unmrowT>V&st$)W=B*qRM4- zD?d*&Y&|5oEH8Mbx6M1GMz46G8?kx-(`%oFq(dr!L zUSP&6&4f=?&USys_#rrxQ|%zZ$x>{iC8OE@kXC>z3Mw~F$S-($GoOB z8DQ0_+IBm8mxQ{B{AG*xkOx$E_945>)Q^G0cYT+_aZSr22n_o}@ zNSBw1eYh~W(BKRT8Rg_MLd!Dyv_4Wo@5G_TAij?(~q;BDROS^N1cYdy!%T z_gmdvP5>3(H9{0&X_ zyPESj;}fnpIV<~x>|3|L3At)>OSqO$c_mA_k{qwN?E7x;&ak8}gUn89s zq5m;j8Pzzj+h#-f&E**ttR$mMW0{oODhX(J`C*2^hN}5tB#;8!EVAv4Dv5|mE|@Nc z^)Bfhx|NVD!{KyX0|+KeBI>{Ma3_ivPgl)?#_kyKx}9I*X^eH?;NtT8IXz}!&|&bQ z0YVpXoyBo@oel?SIIIca=ms?zB7uU^)S%O7yTj))2t(r;^L@Jl2g=?&Am)g0lIWz^ z&+q>ml=1Ye>f@OMo0xs}$=I)bAlgO4#_q(*SM%N!A}T>LLh3Bynw+zr&XS zUA&vnoAr8#mAKttp{TQs);Lp zxL0BBGgnXE_HbMNMshR5W)BY6X14yJQX*>S3{FK>SB(?He>BO$7;rKvOq!a)ydy?W z0G8^hDQOOw-CNL79hE%7?AZI6Uy?VPtY${6f+AJZ8yB>(WOf6J!wbrh=FB2BK-1C* zUD^y^piu>R6sJgvWsvpixu2_d&K6)7Vi|B}JWt?KLMtErZR7u&ID%~*29&AKjV-6;86Tjv>y3W%KhOUg;`;xAb(qaEL$p*F}XSm4pc$5;78>SZ?HoF zWJk=l&S{b({%j^!7i#_O=apig&Km&&6+0PZ#7JykSwqUagLX9N1f#H`cGrw#rmHE( ztS2sWHf3O|VNGP&O=3PW6T1ui(X3;fY0hf_t-7jcXgEt!0hjn~9c^1Ja}?uQR{E41 zL$QT1INc^|3{$+_*;CFt&)kWogj^Q6hya41>fEm**K1X&zAqOm!%Sd>pel$0o~>e; z2winiepK5AW)Y+aQv|38RRmFEz5rYiMx7j-Zyu%jZ0h8ao9qiZJe?95F2PcLRqq!xXh?~uE zS+pjyh@B^e!K{A__>y((ZaFdN$igXhP9O~r2G@dLMQub9*$mREyAf{h&V80U|(th zCS1XKttU5CFjpuYI?`DAV_s5MRB`EQD}q#AVIO}7av1AXKna&Cm|Q_=HOzuQtf*|B zoO7{Vnr+e1YQY`#Vqbk(>C6@p4V5&ytcig-2?g(8_?wr>((7Biz9qtg1$^Ae6@j&b zH$w^gCM?iEFI8A^UHplynOO5|yJg2{ zVCr{(2yg8+Q}Xh^7prZ!oC-nHqt>IEQK0Hm zrQ=!al@@56;whak##qZbw=TC_p)ro0908Zeaa{U(j4mKo|WG zSrZ^WM0{0>7)FC)8nyggCV zs_<86n}W9Q)mBiE;t+O$`ygZZK=>)6Lm-zKcfy1~>P2sW(j!3-S4CH8K}JSgNHMms8S}h^qM1-6%O|F#e zAePY(YXa6M_>a`pyyBVF0%wF(p6BXnl?PeCp56^Ga?2oRAi>d8Uw*`#WB}E(R{$Pj z^AeuI<>sV4ZPu_;Krjfeu*KbFmo$55fA#^Zxk!*>0%pRbc<5RgmRx=B>nN6B56>;xz9lI_3EQ=IBq_(H2#JYRG66PP=l$6LnxIeCxzi%Il@|Djs zl)ik#2KVdQ?`PUKA-A!Fb4JC`zp<`FZfj{`IG||mIT;j=1BRpxqk!SaQkNl!QeV&N z3Rx`2a!Km*OEx&YKC^&ivjRtp)naL|&264Mb`ZD+MtjUjzwrmzEV>8xZ8AYNd>{|{kr z85P&ItPSJtZjEaQ7QBJr?(XgccY-^F;KAM9-JQnWH9&B8hnIcs9pByi-t&#~qvxo8 zx>ofVvzFAXS@o>X1~{J|Hv6KbFH2Xt@#+}}2C_BPl?^cS+t97UhcMbC)k%*fOm@hX zAQiatAXFF9)oXIev&r*~yp=hS>f`CD6UcPo_%!x}4t61hqnVP)b}_$D7Pf+iEO~80 z1nB%(vdXH)`Ep-9aowohz%s}Z@J(e&ZC{h&MhY89{~0wpoYs`cVe5`uPf|@993@Ts z;O@Mt{R<`-67V6$*uh{pP3(3K#4gRJi+>27^JBc24@|mKLF6M!A_l(>OTacS1aG5^ zis1Szm!1VmKbW=G}`&KQ?(8qpwU8Y#=8mM(Kk6V}INsf{0Fr zxI7sg>HLaT0Hg>z>{KGy&XDAmP+sAj!c%^~`d!DRdjyDQ)X#@@uvddjcP2>3*o_$K z{szdjUGBxF=_}l#uW6WsLBP`m_q3Vb-YBnJzh>bV>+aBn|DNpI$bTB=#mVbSwKR;$=Q zNKB(9YXYh(?X!MjdsA zr<)u@20`N#zVH;j{0?gN4ob~4z|vCtA(&Xyv+*3zh@Er(3XE8t3$d3V1^?&xn5Y5E+=DK?& zH5FnHBI~hNZkjw2v6+8L;}Tuu#7P;_$n?IjsxDz&v~CVe_-3_T=oK2Bv?wz^;Vv(9 z!L`@GyGIw!tr`Cw8yd$0(>9uOGHY(4PT^=_KXx>xp+@XJkQx}sgQ|hw)_9yC{C(}5 zDQ|I!+F;y;y{8#Xtz*u;KbW)DJ&ek(Wn46Zo=kV9-glysA`G)}v@~h=lXA`#BsU?vJe$!*~SnfgJsW05nMCSWgxD-O?(H`O6ii zSt;U(XuUscyBvzTXne~giPV@b$A3OQ{a;uLzMULXVgH@T5(0}F?>e;zCqokeR zsQJ8KB7O7O+{Z*ww~{jdPk7wS@o(#0eIox2m#qSscD4m(Ux}R zc*HtrG=q7F+mw>qY!GAup?-gYCKYhs1Y|z*8Nw5w`a*o;x#sAU9(nce$t^1Xqbkp8 z8CJ`6W{fhoOET`+t`dQ53Dg|g#pBt#NWFG~X&yz%Ec4+EeA8>h7_PzD&HM}&tBy&| z;K2Qk_&-tDUu8}$7t)ByABja}g#SuSI2&488yi~x=PIWPwe_epF09UwBCb_EFv38g znU3KbxljmMqKQ zx3}~+pFO3(uZqYjbeELaVPXR|>a#fY6OI=H#TR4KGav5ykD$eq#Wp@T$3HwD*HcLdSD>Pi#vN3Az$w<`ACr?tM+R zQ{g99V?=K!h7AW(gwo;Yk!A}uw+n2hZ|B(6m(yZ^#1;+6f?&`ABbiAZ6vGg|3_`R> z6=Xh)P2=bYXoMqmlIscXIGr&*B)~{42QJ$2c#0}9wc89ie<_Lqw@MUhq%O~x;^Z?> z*x_dQ0l~A4RrtQj1vJuzdPIR}IV!c|}hU(-p@`|uYN!LLm(wYyFCeB9pLqN7IvURxJ4|q5<=N1qi6oe=Dlp(7hXZtWnCZ`Wm!s+ zWgn2?b1*B+S98d_IQWeq?^xggsV_!QJ4XKCh4B{jO>QV>Y>#(cBMGWMx6!|>X1)Ob zCZ{>n62W8FnWt$e5!{tpAT_D&HI%uRdi?bPh;SD1eif@8?+zV5ZZJ{?{fm$f(hO&&HdA4bP@MiU2pNp<}Bz}$!HW~`!l>@ z6*qP?2`UpdxJv2tUp4uCm%&7vJsw`wl%T3rc;)zV`)&f_9KBAvYx-XWSBrd>S^#1O zT>}-V``+KnmiVljibru63*|TV^-lQI2(3Rm_~;VSRTCJ-BsgH9$mxVq)crj7JOyIN zd!vAM$p;2Go%?E+X>a6_Z;uY1s5n6g-zyIUj(0l1mz#)n2| z4HS;>91^IK?zy0Se7}D?ugFL`;KqLh=exi0629L6-rww0hhk{h(I!YYGeryWIqxlU z2WKj+QK9boA!2|2QC#Uu5TvIB6@#5z=#l{K!x`-F83=)Zel+n`*4t~4BJ}OInhcQ$ zX`%t87n*>DO1%sT7WmdeBGqjqa@17AN`5xNlUh6Yz}eYAKDWg5y)%)~Oyf_g9c&-g zs|_opRsWcf`;tGTQZ!YjErKwY{M1UHPjMFIjs&;9-7HP6&AiE|l_s@leLb=aMUX_A z_XdOJ1oOJPzfa(6@zFm?Imuek<8JB$ySrpyc6g=PZ$N$y(mYRQW!j*{`Rjufhq8qdi8sD-*S)I?yX*8Yalcu$D@qj; z@gdh`zps;*pU!wfR+jhSE7B=2VnyK^>~r1SW}@S78V1o;sg@R+x~31R6iGbgi~BTL z`R0+vq|!-?w?;7HD9;VV6@6-0ytJRb|MLKmmZlS=Od7NXeJtbS>A=8XKF%;#oByvP zkFihY-!0&GQzji(xiAJNXOy$qV5JhGq)5R7eoA|8z%HeYCgf7Cn32bSk@SdbemPqO zqbm*Hb8lB&?l_Urgdvdi;(sCgI+T)ilxv+t{;>8=ka{(4+O&W9QZR0_Uz)vC&fOMI7xmlKBzE)5YS2snlmnb$Xm< zc654OYf?;257O3(Vk@N%w{fUVj;22zxZRggtUi%tRG9hl&awJ>fUM!szG_=%MUf27 zedA{;Fo)g*9!7C#YBkr6{kOA&#v$pC&7i)y(tCzR#I^(Bm-;b-4n5;ykhTfpkOVd% zt{%(+sZ)<);V~S^S>5SHC2&#)7VSW7qeb8Fp1!qi(%4d0uCdnkcys>L*X?F}roi=E zKp&Z&i?4S6BplfH)rk)CbYpxOh>zGGct+iU%f$7ah5URJeG@=(E8ZF)dcAdak$3p) zJUTsj3?HCeO;9?C#v5;iEGS!w424|Mh*qEfJ><7cDHB>d)DC7UQTB^pVdRLp@j+9G~bcc@^M#jue)EyJZJGR zHln{&A6p`t_~kt)-pY^8zddWzOe|KSPM4=$qkz8MS1qaU?+BhaI@n$X(q44)n|Z

gCv0cCMS`pHsC~V7f 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

Z|0b-NI3JkQdSN>SaBd7|gGf=XZVgw1 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 diff --git a/luaj-test/test/lua/repack.sh b/luaj-test/test/lua/repack.sh deleted file mode 100644 index ffece46c..00000000 --- a/luaj-test/test/lua/repack.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -# -# unpack the luaj test archive, compile and run it locally, and repack the results - -# unzip existing archive -unzip -n luaj3.0-tests.zip -rm *.lc *.out */*.lc */*.out - -# compile tests for compiler and save binary files -for DIR in "lua5.2.1-tests" "regressions"; do - cd ${DIR} - FILES=`ls -1 *.lua | awk 'BEGIN { FS="." } ; { print $1 }'` - for FILE in $FILES ; do - echo 'compiling' `pwd` $FILE - luac ${FILE}.lua - mv luac.out ${FILE}.lc - done - cd .. -done - -# run test lua scripts and save output -for DIR in "errors" "perf" "."; do - cd ${DIR} - FILES=`ls -1 *.lua | awk 'BEGIN { FS="." } ; { print $1 }'` - for FILE in $FILES ; do - echo 'executing' `pwd` $FILE - lua ${FILE}.lua JSE > ${FILE}.out - done - cd .. -done -cd lua - -# create new zipfile -rm -f luaj3.0-tests.zip regressions -zip luaj3.0-tests.zip *.lua *.lc *.out */*.lua */*.lc */*.out - -# cleanup -rm *.out */*.lc */*.out -rm -r lua5.2.1-tests