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