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