---
source: src/main.rs
expression: compiled
input_file: test-data/lua5.2-tests/vararg.lua
---
print('testing vararg');
_G.arg = nil
global fn f(a, ...) {
local arg = {
n = select('#', ...),
...
}
for i = 1, arg.n {
assert(a[(i)] == arg[(i)]);
}
return arg.n
}
global fn c12(...) {
assert(arg == nil);
local x = {
...
}
x.n = #x
local res = (x.n == 2 && x[(1)] == 1 && x[(2)] == 2)
if res {
res = 55
}
return res, 2
}
global fn vararg(...) {
return {
n = select('#', ...),
...
}
}
local call = fn (f, args) {
return f(table.unpack(args, 1, args.n))
}
assert(f() == 0);
assert(f({
1,
2,
3
}, 1, 2, 3) == 3);
assert(f({
"alo",
nil,
45,
f,
nil
}, "alo", nil, 45, f, nil) == 5);
assert(c12(1, 2) == 55);
a, b = assert(call(c12, {
1,
2
}))
assert(a == 55 && b == 2);
a = call(c12, {
1,
2,
n = 2
})
assert(a == 55 && b == 2);
a = call(c12, {
1,
2,
n = 1
})
assert(!a);
assert(c12(1, 2, 3) == false);
local a = vararg(call(next, {
_G,
nil,
n = 2
}))
local b, c = next(_G)
assert(a[(1)] == b && a[(2)] == c && a.n == 2);
a = vararg(call(call, {
c12,
{
1,
2
}
}))
assert(a.n == 2 && a[(1)] == 55 && a[(2)] == 2);
a = call(print, {
'+'
})
assert(a == nil);
local t = {
1,
10
}
method t::f(...) {
local arg = {
...
}
return self[(...)] + #arg
}
assert(t::f(1, 4) == 3 && t::f(2) == 11);
print('+');
lim = 20
local i, a = 1, {}
while i <= lim {
a[(i)] = i + 0.3
i = i + 1
}
global fn f(a, b, c, d, ...) {
local more = {
...
}
assert(a == 1.3 && more[(1)] == 5.3 && more[(lim - 4)] == lim + 0.3 && !more[(lim - 3)]);
}
global fn g(a, b, c) {
assert(a == 1.3 && b == 2.3 && c == 3.3);
}
call(f, a);
call(g, a);
a = {}
i = 1
while i <= lim {
a[(i)] = i
i = i + 1
}
assert(call(math.max, a) == lim);
print("+");
global fn oneless(a, ...) {
return ...
}
global fn f(n, a, ...) {
local b
assert(arg == nil);
if n == 0 {
local b, c, d = ...
return a, b, c, d, oneless(oneless(oneless(...)))
} else {
n, b, a = n - 1, ..., a
assert(b == ...);
return f(n, a, ...)
}
}
a, b, c, d, e = assert(f(10, 5, 4, 3, 2, 1))
assert(a == 5 && b == 4 && c == 3 && d == 2 && e == 1);
a, b, c, d, e = f(4)
assert(a == nil && b == nil && c == nil && d == nil && e == nil);
f = load([[ return {...} ]])
x = f(2, 3)
assert(x[(1)] == 2 && x[(2)] == 3 && x[(3)] == nil);
f = load([[
local x = {...}
for i=1,select('#', ...) do assert(x[i] == select(i, ...)) end
assert(x[select('#', ...)+1] == nil)
return true
]])
assert(f("a", "b", nil, {}, assert));
assert(f());
a = {
select(3, table.unpack({
10,
20,
30,
40
}))
}
assert(#a == 2 && a[(1)] == 30 && a[(2)] == 40);
a = {
select(1)
}
assert(next(a) == nil);
a = {
select(-1, 3, 5, 7)
}
assert(a[(1)] == 7 && a[(2)] == nil);
a = {
select(-2, 3, 5, 7)
}
assert(a[(1)] == 5 && a[(2)] == 7 && a[(3)] == nil);
pcall(select, 10000);
pcall(select, -10000);
print('OK');