---
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");