Improve argument type checking.

This commit is contained in:
James Roseborough
2008-07-23 23:52:20 +00:00
parent 5da65f7d41
commit 45e60c4b21
9 changed files with 44 additions and 10 deletions

View File

@@ -152,13 +152,16 @@ local function subbanner(name)
print( '--- '..tostring(name) )
end
local function pack(s,...)
return s,{...}
end
-- check that all combinations of arguments pass
function checkallpass( name, typesets, typesonly )
subbanner('checkallpass')
for i,v in arglists(typesets) do
local sig = signature(name,v)
local r = { invoke( name, v ) }
local s = table.remove( r, 1 )
local s,r = pack( invoke( name, v ) )
if s then
if typesonly then
print( ok, sig, types(r) )

View File

@@ -59,7 +59,7 @@ checkallerrors('loadfile', {nonstring}, 'bad argument #1')
banner('loadstring')
checkallpass('loadstring', {{'return'}})
checkallpass('loadstring', {{'return'},{'mychunk'}})
checkallpass('loadstring', {{'return a ... b'},{'mychunk'}})
checkallpass('loadstring', {{'return a ... b'},{'mychunk'}},true)
checkallerrors('loadstring', {{'return a ... b'},{'mychunk'}},'hello')
checkallerrors('loadstring', {notastring,{nil,astring,anumber}}, 'bad argument #1')
checkallerrors('loadstring', {{'return'},{afunction,atable}}, 'bad argument #2')

View File

@@ -8,20 +8,20 @@ local notanumber = {nil,astring,aboolean,afunction,atable,athread}
local nonnumber = {astring,aboolean,afunction,atable}
local singleargfunctions = {
'abs', 'acos', 'asin', 'atan', 'ceil', 'cos', 'cosh', 'deg', 'exp', 'floor',
'abs', 'acos', 'asin', 'atan', 'cos', 'cosh', 'deg', 'exp', 'floor',
'rad', 'randomseed', 'sin', 'sinh', 'tan', 'tanh', 'frexp',
}
local singleargposdomain = {
'log', 'log10', 'sqrt',
'log', 'log10', 'sqrt', 'ceil',
}
local twoargfunctions = {
'atan2', 'fmod',
'atan2',
}
local twoargsposdomain = {
'pow',
'pow', 'fmod',
}
-- single argument tests

View File

@@ -4,6 +4,8 @@ print( math.sqrt( 9.0 ) )
print( math.modf( 5.25 ) )
local aliases = {
['0']='<zero>',
['-0']='<zero>',
['nan']='<nan>',
['inf']='<pos-inf>',
['-inf']='<neg-inf>',

View File

@@ -1,3 +1,5 @@
-- unit tests for module() function
local ids = {}
local function id(obj)
@@ -72,3 +74,17 @@ f()
print( a )
print( getfenv(f)['a'] )
print( a )
-- do metatables work with package.loaded and require?
print( 'setting metatable for package.loaded' )
print( 'package.loaded.mypreload', package.loaded.mypreload )
print( 'setmetatable')
pcall( setmetatable, package.loaded, { __index={mypreload=12345}})
print( 'package.loaded.mypreload', package.loaded.mypreload )
print( "require, 'mypreload'", pcall( require, 'mypreload' ) )
print( 'package.loaded.mypreload', package.loaded.mypreload )
print( 'resetting metatable for package.loaded' )
print( 'setmetatable')
pcall( setmetatable, package.loaded, nil )
print( "require, 'mypreload'", (pcall( require, 'mypreload' )) )
print( 'package.loaded.mypreload', package.loaded.mypreload )

View File

@@ -20,6 +20,13 @@ local function ct(f,a,b,c)
return f(a,b,c)
end
-- wrap pcall to be more useful in testing
local pc = pcall
local pcall = function(...)
local s,c = pc(...)
return s, type(c)
end
-- lua calls
print( 'lc(22,33,44)', lc(22,33,44) )
print( 'pcall(lc,22,33,44)', pcall(lc,22,33,44) )
@@ -50,3 +57,4 @@ for i = 0,4 do
print( 'pcall(le,i)', i, pcall(le,i) )
print( 'pcall(ge,i)', i, pcall(ge,i) )
end