You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.7 KiB
135 lines
3.7 KiB
|
|
local b = 20
|
|
|
|
function addOne ()
|
|
assertTrue (b == 20, 'Functions should be able to access locals of parent closures [1]')
|
|
|
|
function nested ()
|
|
assertTrue (b == 20, 'Functions should be able to access locals of parent closures [2]')
|
|
|
|
local c = 9
|
|
assertTrue (c == 9, 'Functions should be able to access their own locals')
|
|
end
|
|
|
|
nested ()
|
|
assertTrue (c == nil, 'Function locals should not be accessible from outside the function')
|
|
|
|
b = b + 1
|
|
assertTrue (b == 21, 'Operations performed on upvalues should use external value')
|
|
end
|
|
|
|
addOne ()
|
|
assertTrue (b == 21, 'Operations performed on upvalues in functions should affect the external value too')
|
|
|
|
|
|
function f (...)
|
|
local a, b, c = ...
|
|
assertTrue (a == -1, 'Varargs should pass values around correctly [1]')
|
|
assertTrue (b == 0, 'Varargs should pass values around correctly [2]')
|
|
assertTrue (c == 2, 'Varargs should pass values around correctly [3]')
|
|
|
|
local d, e, f, g, h = ...
|
|
assertTrue (d == -1, 'Varargs should pass values around correctly [4]')
|
|
assertTrue (e == 0, 'Varargs should pass values around correctly [5]')
|
|
assertTrue (f == 2, 'Varargs should pass values around correctly [6]')
|
|
assertTrue (g == 9, 'Varargs should pass values around correctly [7]')
|
|
assertTrue (h == nil, 'Varargs should pass nil for list entries beyond its length')
|
|
end
|
|
|
|
f(-1,0,2,9)
|
|
|
|
|
|
function g (a, ...)
|
|
local b, c = ...
|
|
assertTrue (a == -1, 'Varargs should pass values around correctly [8]')
|
|
assertTrue (b == 0, 'Varargs should pass values around correctly [9]')
|
|
assertTrue (c == 2, 'Varargs should pass values around correctly [10]')
|
|
end
|
|
|
|
g(-1,0,2,9)
|
|
|
|
|
|
function h (a, b, ...)
|
|
local c = ...
|
|
assertTrue (a == -1, 'Varargs should pass values around correctly [11]')
|
|
assertTrue (b == 0, 'Varargs should pass values around correctly [12]')
|
|
assertTrue (c == 2, 'Varargs should pass values around correctly [13]')
|
|
end
|
|
|
|
h(-1,0,2,9)
|
|
|
|
|
|
function getFunc ()
|
|
local b = 6
|
|
return function () return b end
|
|
end
|
|
|
|
x = getFunc () ()
|
|
assertTrue (x == 6, 'Functions should be able to return functions (and maintain their scope)')
|
|
|
|
|
|
|
|
function add (val1)
|
|
return function (val2) return val1 + val2 end
|
|
end
|
|
|
|
local addThree = add (3)
|
|
x = addThree (4)
|
|
|
|
assertTrue (x == 7, 'Functions should be able to be curried')
|
|
|
|
|
|
do
|
|
local function x()
|
|
return 'inner'
|
|
end
|
|
|
|
function y()
|
|
return x()
|
|
end
|
|
end
|
|
|
|
function x()
|
|
return 'outer'
|
|
end
|
|
|
|
local z = y()
|
|
assertTrue (z == 'inner', 'Local functions should be locally scoped')
|
|
|
|
|
|
function oneTwo()
|
|
return 1, 2
|
|
end
|
|
|
|
function testReturnValues()
|
|
return oneTwo(), 10
|
|
end
|
|
|
|
local a, b, c = testReturnValues()
|
|
assertTrue (a == 1, 'return should return the first item returned from a function call')
|
|
assertTrue (b == 10, 'return should only return the first item from a function call when not last item in an expression list')
|
|
assertTrue (c == nil, 'return should know when to stop')
|
|
|
|
function testReturnValues2()
|
|
return 10, oneTwo()
|
|
end
|
|
|
|
local a, b, c = testReturnValues2()
|
|
assertTrue (a == 10, 'return should return the first item in an expression list')
|
|
assertTrue (b == 1, 'return should return the first item from a function call')
|
|
assertTrue (c == 2, 'return should return all items returned from a function call if at end of expression list')
|
|
|
|
function testArgs1(a, b, c)
|
|
assertTrue (a == 1, 'Function call in argument list should pass return value as argument')
|
|
assertTrue (b == 10, 'Function call in middle of argument list should only pass one argument')
|
|
assertTrue (c == nil, 'Arguments should stop at the end of argument list')
|
|
end
|
|
testArgs1(oneTwo(), 10)
|
|
|
|
function testArgs2(a, b, c)
|
|
assertTrue (a == 10, 'Arguments should be passed in order')
|
|
assertTrue (b == 1, 'Function call should pass return values')
|
|
assertTrue (c == 2, 'Function call at end of argument list should pass all return values')
|
|
end
|
|
testArgs2(10, oneTwo())
|