vararg.lua (3416B)
1 -- $Id: testes/vararg.lua $ 2 -- See Copyright Notice in file all.lua 3 4 print('testing vararg') 5 6 local function f (a, ...) 7 local x = {n = select('#', ...), ...} 8 for i = 1, x.n do assert(a[i] == x[i]) end 9 return x.n 10 end 11 12 local function c12 (...) 13 assert(arg == _G.arg) -- no local 'arg' 14 local x = {...}; x.n = #x 15 local res = (x.n==2 and x[1] == 1 and x[2] == 2) 16 if res then res = 55 end 17 return res, 2 18 end 19 20 local function vararg (...) return {n = select('#', ...), ...} end 21 22 local call = function (f, args) return f(table.unpack(args, 1, args.n)) end 23 24 assert(f() == 0) 25 assert(f({1,2,3}, 1, 2, 3) == 3) 26 assert(f({"alo", nil, 45, f, nil}, "alo", nil, 45, f, nil) == 5) 27 28 assert(vararg().n == 0) 29 assert(vararg(nil, nil).n == 2) 30 31 assert(c12(1,2)==55) 32 local a,b = assert(call(c12, {1,2})) 33 assert(a == 55 and b == 2) 34 a = call(c12, {1,2;n=2}) 35 assert(a == 55 and b == 2) 36 a = call(c12, {1,2;n=1}) 37 assert(not a) 38 assert(c12(1,2,3) == false) 39 local a = vararg(call(next, {_G,nil;n=2})) 40 local b,c = next(_G) 41 assert(a[1] == b and a[2] == c and a.n == 2) 42 a = vararg(call(call, {c12, {1,2}})) 43 assert(a.n == 2 and a[1] == 55 and a[2] == 2) 44 a = call(print, {'+'}) 45 assert(a == nil) 46 47 local t = {1, 10} 48 function t:f (...) local arg = {...}; return self[...]+#arg end 49 assert(t:f(1,4) == 3 and t:f(2) == 11) 50 print('+') 51 52 local lim = 20 53 local i, a = 1, {} 54 while i <= lim do a[i] = i+0.3; i=i+1 end 55 56 function f(a, b, c, d, ...) 57 local more = {...} 58 assert(a == 1.3 and more[1] == 5.3 and 59 more[lim-4] == lim+0.3 and not more[lim-3]) 60 end 61 62 local function g (a,b,c) 63 assert(a == 1.3 and b == 2.3 and c == 3.3) 64 end 65 66 call(f, a) 67 call(g, a) 68 69 a = {} 70 i = 1 71 while i <= lim do a[i] = i; i=i+1 end 72 assert(call(math.max, a) == lim) 73 74 print("+") 75 76 77 -- new-style varargs 78 79 local function oneless (a, ...) return ... end 80 81 function f (n, a, ...) 82 local b 83 assert(arg == _G.arg) -- no local 'arg' 84 if n == 0 then 85 local b, c, d = ... 86 return a, b, c, d, oneless(oneless(oneless(...))) 87 else 88 n, b, a = n-1, ..., a 89 assert(b == ...) 90 return f(n, a, ...) 91 end 92 end 93 94 a,b,c,d,e = assert(f(10,5,4,3,2,1)) 95 assert(a==5 and b==4 and c==3 and d==2 and e==1) 96 97 a,b,c,d,e = f(4) 98 assert(a==nil and b==nil and c==nil and d==nil and e==nil) 99 100 101 -- varargs for main chunks 102 local f = load[[ return {...} ]] 103 local x = f(2,3) 104 assert(x[1] == 2 and x[2] == 3 and x[3] == undef) 105 106 107 f = load[[ 108 local x = {...} 109 for i=1,select('#', ...) do assert(x[i] == select(i, ...)) end 110 assert(x[select('#', ...)+1] == undef) 111 return true 112 ]] 113 114 assert(f("a", "b", nil, {}, assert)) 115 assert(f()) 116 117 a = {select(3, table.unpack{10,20,30,40})} 118 assert(#a == 2 and a[1] == 30 and a[2] == 40) 119 a = {select(1)} 120 assert(next(a) == nil) 121 a = {select(-1, 3, 5, 7)} 122 assert(a[1] == 7 and a[2] == undef) 123 a = {select(-2, 3, 5, 7)} 124 assert(a[1] == 5 and a[2] == 7 and a[3] == undef) 125 pcall(select, 10000) 126 pcall(select, -10000) 127 128 129 -- bug in 5.2.2 130 131 function f(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, 132 p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, 133 p21, p22, p23, p24, p25, p26, p27, p28, p29, p30, 134 p31, p32, p33, p34, p35, p36, p37, p38, p39, p40, 135 p41, p42, p43, p44, p45, p46, p48, p49, p50, ...) 136 local a1,a2,a3,a4,a5,a6,a7 137 local a8,a9,a10,a11,a12,a13,a14 138 end 139 140 -- assertion fail here 141 f() 142 143 -- missing arguments in tail call 144 do 145 local function f(a,b,c) return c, b end 146 local function g() return f(1,2) end 147 local a, b = g() 148 assert(a == nil and b == 2) 149 end 150 print('OK') 151