--- source: src/main.rs expression: compiled input_file: test-data/lua5.2-tests/main.lua --- if _port { return } print("testing lua.c options"); assert(os.execute()); prog = os.tmpname() otherprog = os.tmpname() out = os.tmpname() { local i = 0 while arg[(i)] { i = i - 1 } progname = arg[(i + 1)] } print("progname: " .. progname); local prepfile = fn (s, p) { p = p || prog io.output(p); io.write(s); assert(io.close()); } global fn getoutput() { io.input(out); local t = io.read("*a") io.input()::close(); assert(os.remove(out)); return t } global fn checkprogout(s) { local t = getoutput() for line with string.gmatch(s, ".-\n") { assert(string.find(t, line, 1, true)); } } global fn checkout(s) { local t = getoutput() if s != t { print(string.format("'%s' - '%s'\n", s, t)); } assert(s == t); return t } global fn auxrun(...) { local s = string.format(...) s = string.gsub(s, "lua", '"' .. progname .. '"', 1) return os.execute(s) } global fn RUN(...) { assert(auxrun(...)); } global fn NoRun(...) { assert(!auxrun(...)); } global fn NoRunMsg(...) { print("\n(the next error is expected by the test)"); return NoRun(...) } prepfile("print(package.path)"); RUN("env LUA_INIT= LUA_PATH=x lua %s > %s", prog, out); checkout("x\n"); RUN("env LUA_INIT= LUA_PATH_5_2=y LUA_PATH=x lua %s > %s", prog, out); checkout("y\n"); prepfile("print(package.cpath)"); RUN("env LUA_INIT= LUA_CPATH=xuxu lua %s > %s", prog, out); checkout("xuxu\n"); RUN("env LUA_INIT= LUA_CPATH_5_2=yacc LUA_CPATH=x lua %s > %s", prog, out); checkout("yacc\n"); prepfile("print(X)"); RUN('env LUA_INIT="X=3" lua %s > %s', prog, out); checkout("3\n"); prepfile("print(X)"); RUN('env LUA_INIT_5_2="X=10" LUA_INIT="X=3" lua %s > %s', prog, out); checkout("10\n"); 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") assert(!string.find(defaultpath, "xxx") && string.find(defaultpath, "lua")); local fn 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) assert(string.gsub(p, ";;", ";" .. defaultpath .. ";") == expected); } convert(";"); convert(";;"); convert(";;;"); convert(";;;;"); convert(";;;;;"); convert(";;a;;;bc"); 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(""); 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)); 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); 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'); prepfile(string.format(`io.output(%q); io.write('alo')`, out)); RUN("lua %s", prog); checkout('alo'); RUN(`lua -v -e'print"hello"' > %s`, out); t = getoutput() assert(string.find(t, "PUC%-Rio\nhello")); 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); prepfile("os.exit(false, true)"); NoRun("lua %s", prog); assert(os.remove(prog)); assert(os.remove(otherprog)); assert(!os.remove(out)); RUN("lua -v"); NoRunMsg("lua -h"); NoRunMsg("lua -e"); NoRunMsg("lua -e a"); NoRunMsg("lua -f"); print("OK");