aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPhilipp Janda <siffiejoe@gmx.net>2015-01-20 11:35:16 +0100
committerPhilipp Janda <siffiejoe@gmx.net>2015-01-20 11:35:16 +0100
commit866cb79f65c844b3fcfa99d2caa4bf19930dbc6d (patch)
tree338699b9df9b2c99cec053321790e9a5960c4b3b /tests
parente52c3c4e7af665acd23e63fd3ae85f2c8ae87e49 (diff)
downloadlua-compat-5.3-866cb79f65c844b3fcfa99d2caa4bf19930dbc6d.tar.gz
lua-compat-5.3-866cb79f65c844b3fcfa99d2caa4bf19930dbc6d.tar.bz2
lua-compat-5.3-866cb79f65c844b3fcfa99d2caa4bf19930dbc6d.zip
luajit already has yieldable (x)pcall, add tests for code from compat52
Diffstat (limited to 'tests')
-rwxr-xr-xtests/test.lua346
1 files changed, 345 insertions, 1 deletions
diff --git a/tests/test.lua b/tests/test.lua
index 423fb5b..98259fe 100755
--- a/tests/test.lua
+++ b/tests/test.lua
@@ -1,8 +1,9 @@
1#!/usr/bin/env lua 1#!/usr/bin/env lua
2 2
3local F, tproxy, ___ 3local F, tproxy, writefile, noprint, ___
4do 4do
5 local type, unpack = type, table.unpack or unpack 5 local type, unpack = type, table.unpack or unpack
6 local assert, io = assert, io
6 function F(...) 7 function F(...)
7 local args, n = { ... }, select('#', ...) 8 local args, n = { ... }, select('#', ...)
8 for i = 1, n do 9 for i = 1, n do
@@ -20,6 +21,12 @@ do
20 __len = function() return #t end, 21 __len = function() return #t end,
21 }), t 22 }), t
22 end 23 end
24 function writefile(name, contents, bin)
25 local f = assert(io.open(name, bin and "wb" or "w"))
26 f:write(contents)
27 f:close()
28 end
29 function noprint() end
23 local sep = ("="):rep(70) 30 local sep = ("="):rep(70)
24 function ___() 31 function ___()
25 print(sep) 32 print(sep)
@@ -27,6 +34,7 @@ do
27end 34end
28 35
29local V = _VERSION:gsub("^.*(%d+)%.(%d+)$", "%1%2") 36local V = _VERSION:gsub("^.*(%d+)%.(%d+)$", "%1%2")
37if jit then V = "jit" end
30 38
31print( "testing Lua API ..." ) 39print( "testing Lua API ..." )
32package.path = "../?.lua;"..package.path 40package.path = "../?.lua;"..package.path
@@ -217,6 +225,342 @@ print("math.ult", pcall(math.ult, 1, 2.1))
217___'' 225___''
218 226
219 227
228print("testing Lua API for Lua 5.1 ...")
229
230___''
231print("debug.getuservalue()", F(debug.getuservalue(false)))
232print("debug.setuservalue()", pcall(function()
233 debug.setuservalue(false, {})
234end))
235print("debug.setmetatable()", F(debug.setmetatable({}, {})))
236
237
238___''
239do
240 local t = setmetatable({}, {
241 __pairs = function() return pairs({ a = "a" }) end,
242 })
243 for k,v in pairs(t) do
244 print("pairs()", k, v)
245 end
246end
247
248
249___''
250do
251 local code = "print('hello world')\n"
252 local badcode = "print('blub\n"
253 print("load()", pcall(function() load(true) end))
254 print("load()", F(load(badcode)))
255 print("load()", F(load(code)))
256 print("load()", F(load(code, "[L]")))
257 print("load()", F(load(code, "[L]", "b")))
258 print("load()", F(load(code, "[L]", "t")))
259 print("load()", F(load(code, "[L]", "bt")))
260 local f = load(code, "[L]", "bt", {})
261 print("load()", pcall(f))
262 f = load(code, "[L]", "bt", { print = noprint })
263 print("load()", pcall(f))
264 local bytecode = string.dump(f)
265 print("load()", F(load(bytecode)))
266 print("load()", F(load(bytecode, "[L]")))
267 print("load()", F(load(bytecode, "[L]", "b")))
268 print("load()", F(load(bytecode, "[L]", "t")))
269 print("load()", F(load(bytecode, "[L]", "bt")))
270 f = load(bytecode, "[L]", "bt", {})
271 print("load()", pcall(f))
272 f = load(bytecode, "[L]", "bt", { print = noprint })
273 print("load()", pcall(f))
274 local function make_loader(code)
275 local mid = math.floor( #code/2 )
276 local array = { code:sub(1, mid), code:sub(mid+1) }
277 local i = 0
278 return function()
279 i = i + 1
280 return array[i]
281 end
282 end
283 print("load()", F(load(make_loader(badcode))))
284 print("load()", F(load(make_loader(code))))
285 print("load()", F(load(make_loader(code), "[L]")))
286 print("load()", F(load(make_loader(code), "[L]", "b")))
287 print("load()", F(load(make_loader(code), "[L]", "t")))
288 print("load()", F(load(make_loader(code), "[L]", "bt")))
289 f = load(make_loader(code), "[L]", "bt", {})
290 print("load()", pcall(f))
291 f = load(make_loader(code), "[L]", "bt", { print = noprint })
292 print("load()", pcall(f))
293 print("load()", F(load(make_loader(bytecode))))
294 print("load()", F(load(make_loader(bytecode), "[L]")))
295 print("load()", F(load(make_loader(bytecode), "[L]", "b")))
296 print("load()", F(load(make_loader(bytecode), "[L]", "t")))
297 print("load()", F(load(make_loader(bytecode), "[L]", "bt")))
298 f = load(make_loader(bytecode), "[L]", "bt", {})
299 print("load()", pcall(f))
300 f = load(make_loader(bytecode), "[L]", "bt", { print = noprint })
301 print("load()", pcall(f))
302 writefile("good.lua", code)
303 writefile("bad.lua", badcode)
304 writefile("good.luac", bytecode, true)
305 print("loadfile()", F(loadfile("bad.lua")))
306 print("loadfile()", F(loadfile("good.lua")))
307 print("loadfile()", F(loadfile("good.lua", "b")))
308 print("loadfile()", F(loadfile("good.lua", "t")))
309 print("loadfile()", F(loadfile("good.lua", "bt")))
310 f = loadfile("good.lua", "bt", {})
311 print("loadfile()", pcall(f))
312 f = loadfile("good.lua", "bt", { print = noprint })
313 print("loadfile()", pcall(f))
314 print("loadfile()", F(loadfile("good.luac")))
315 print("loadfile()", F(loadfile("good.luac", "b")))
316 print("loadfile()", F(loadfile("good.luac", "t")))
317 print("loadfile()", F(loadfile("good.luac", "bt")))
318 f = loadfile("good.luac", "bt", {})
319 print("loadfile()", pcall(f))
320 f = loadfile("good.luac", "bt", { print = noprint })
321 print("loadfile()", pcall(f))
322 os.remove("good.lua")
323 os.remove("bad.lua")
324 os.remove("good.luac")
325end
326
327
328___''
329do
330 local function func(throw)
331 if throw then
332 error("argh")
333 else
334 return 1, 2, 3
335 end
336 end
337 local function tb(err) return "|"..err.."|" end
338 print("xpcall()", xpcall(func, debug.traceback, false))
339 print("xpcall()", xpcall(func, debug.traceback, true))
340 print("xpcall()", xpcall(func, tb, true))
341 local function func2(cb)
342 print("xpcall()", xpcall(cb, debug.traceback, "str"))
343 end
344 local function func3(cb)
345 print("pcall()", pcall(cb, "str"))
346 end
347 local function cb(arg)
348 coroutine.yield(2)
349 return arg
350 end
351 local c = coroutine.wrap(func2)
352 print("xpcall()", c(cb))
353 print("xpcall()", c())
354 local c = coroutine.wrap(func3)
355 print("pcall()", c(cb))
356 print("pcall()", c())
357end
358
359
360___''
361do
362 local t = setmetatable({ 1 }, { __len = function() return 5 end })
363 print("rawlen()", rawlen(t), rawlen("123"))
364end
365
366
367___''
368print("os.execute()", os.execute("exit 1"))
369io.flush()
370print("os.execute()", os.execute("echo 'hello world!'"))
371io.flush()
372print("os.execute()", os.execute("no_such_file"))
373
374
375___''
376do
377 local t = table.pack("a", nil, "b", nil)
378 print("table.(un)pack()", t.n, table.unpack(t, 1, t.n))
379end
380
381
382___''
383do
384 print("coroutine.running()", F(coroutine.wrap(function()
385 return coroutine.running()
386 end)()))
387 print("coroutine.running()", F(coroutine.running()))
388 local main_co, co1, co2 = coroutine.running()
389 -- coroutine.yield
390 print("coroutine.yield()", pcall(function()
391 coroutine.yield(1, 2, 3)
392 end))
393 print("coroutine.yield()", coroutine.wrap(function()
394 coroutine.yield(1, 2, 3)
395 end)())
396 print("coroutine.resume()", coroutine.resume(main_co, 1, 2, 3))
397 co1 = coroutine.create(function(a, b, c)
398 print("coroutine.resume()", a, b, c)
399 return a, b, c
400 end)
401 print("coroutine.resume()", coroutine.resume(co1, 1, 2, 3))
402 co1 = coroutine.create(function()
403 print("coroutine.status()", "[co1] main is", coroutine.status(main_co))
404 print("coroutine.status()", "[co1] co2 is", coroutine.status(co2))
405 end)
406 co2 = coroutine.create(function()
407 print("coroutine.status()", "[co2] main is", coroutine.status(main_co))
408 print("coroutine.status()", "[co2] co2 is", coroutine.status(co2))
409 coroutine.yield()
410 coroutine.resume(co1)
411 end)
412 print("coroutine.status()", coroutine.status(main_co))
413 print("coroutine.status()", coroutine.status(co2))
414 coroutine.resume(co2)
415 print("coroutine.status()", F(coroutine.status(co2)))
416 coroutine.resume(co2)
417 print("coroutine.status()", F(coroutine.status(co2)))
418end
419
420
421___''
422print("math.log()", math.log(1000))
423print("math.log()", math.log(1000, 10))
424
425
426___''
427do
428 local path, prefix = "./?.lua;?/init.lua;../?.lua", "package.searchpath()"
429 print(prefix, package.searchpath("no.such.module", path))
430 print(prefix, package.searchpath("no.such.module", ""))
431 print(prefix, package.searchpath("compat52", path))
432 print(prefix, package.searchpath("no:such:module", path, ":", "|"))
433end
434
435
436___''
437do
438 local function mod_func() return {} end
439 local function my_searcher(name)
440 if name == "my.module" then
441 print("package.searchers", "my.module found")
442 return mod_func
443 end
444 end
445 local function my_searcher2(name)
446 if name == "my.module" then
447 print("package.searchers", "my.module found 2")
448 return mod_func
449 end
450 end
451 table.insert(package.searchers, my_searcher)
452 require("my.module")
453 package.loaded["my.module"] = nil
454 local new_s = { my_searcher2 }
455 for i,f in ipairs(package.searchers) do
456 new_s[i+1] = f
457 end
458 package.searchers = new_s
459 require("my.module")
460end
461
462
463___''
464do
465 print("string.find()", ("abc\0abc\0abc"):find("[^a\0]+"))
466 print("string.find()", ("abc\0abc\0abc"):find("%w+\0", 5))
467 for x in ("abc\0def\0ghi"):gmatch("[^\0]+") do
468 print("string.gmatch()", x)
469 end
470 for x in ("abc\0def\0ghi"):gmatch("%w*\0") do
471 print("string.gmatch()", #x)
472 end
473 print("string.gsub()", ("abc\0def\0ghi"):gsub("[\0]", "X"))
474 print("string.gsub()", ("abc\0def\0ghi"):gsub("%w*\0", "X"))
475 print("string.gsub()", ("abc\0def\0ghi"):gsub("%A", "X"))
476 print("string.match()", ("abc\0abc\0abc"):match("([^\0a]+)"))
477 print("string.match()", #("abc\0abc\0abc"):match(".*\0"))
478 print("string.rep()", string.rep("a", 0))
479 print("string.rep()", string.rep("b", 1))
480 print("string.rep()", string.rep("c", 4))
481 print("string.rep()", string.rep("a", 0, "|"))
482 print("string.rep()", string.rep("b", 1, "|"))
483 print("string.rep()", string.rep("c", 4, "|"))
484 local _tostring = tostring
485 function tostring(v)
486 if type(v) == "number" then
487 return "(".._tostring(v)..")"
488 else
489 return _tostring(v)
490 end
491 end
492 print("string.format()", string.format("%q", "\"\\\0000\0010\r0\n0\t0\""))
493 print("string.format()", string.format("%12.3fx%%sxx%.6s", 3.1, {}))
494 print("string.format()", string.format("%-3f %%%s %%s", 3.1, true))
495 print("string.format()", string.format("% 3.2g %%d %%%s", 3.1, nil))
496 print("string.format()", string.format("%+3d %%d %%%%%10.6s", 3, io.stdout))
497 print("string.format()", pcall(function()
498 print("string.format()", string.format("%d %%s", {}))
499 end))
500 tostring = _tostring
501end
502
503
504___''
505do
506 print("io.write()", io.type(io.write("hello world\n")))
507 local f = assert(io.tmpfile())
508 print("file:write()", io.type(f:write("hello world\n")))
509 f:close()
510end
511
512
513___''
514do
515 writefile("data.txt", "123 18.8 hello world\ni'm here\n")
516 for a,b in io.lines("test.lua", 2, "*l") do
517 print("io.lines()", a, b)
518 break
519 end
520 for l in io.lines("test.lua") do
521 print("io.lines()", l)
522 break
523 end
524 for n1,n2,rest in io.lines("data.txt", "*n", "*n", "*a") do
525 print("io.lines()", n1, n2, rest)
526 end
527 for l in io.lines("data.txt") do
528 print("io.lines()", l)
529 end
530 print("io.lines()", pcall(function()
531 for l in io.lines("data.txt", "*x") do print(l) end
532 end))
533 print("io.lines()", pcall(function()
534 for l in io.lines("no_such_file.txt") do print(l) end
535 end))
536 local f = assert(io.open("test.lua", "r"))
537 for a,b in f:lines(2, "*l") do
538 print("file:lines()", a, b)
539 break
540 end
541 f:close()
542 f = assert(io.open("data.txt", "r"))
543 for n1,n2,rest in f:lines("*n", "*n", "*a") do
544 print("file:lines()", n1, n2, rest)
545 end
546 f:close()
547 f = assert(io.open("data.txt", "r"))
548 for l in f:lines() do
549 print("file:lines()", l)
550 end
551 f:close()
552 print("file:lines()", pcall(function()
553 for l in f:lines() do print(l) end
554 end))
555 print("file:lines()", pcall(function()
556 local f = assert(io.open("data.txt", "r"))
557 for l in f:lines("*l", "*x") do print(l) end
558 f:close()
559 end))
560 os.remove("data.txt")
561end
562___''
563
220 564
221print("testing C API ...") 565print("testing C API ...")
222local mod = require("testmod") 566local mod = require("testmod")