diff --git a/src/test/errors/args.lua b/src/test/errors/args.lua
index 96396f15..a935a8ed 100644
--- a/src/test/errors/args.lua
+++ b/src/test/errors/args.lua
@@ -1,5 +1,10 @@
-- utilities to check that args of various types pass or fail
-- argument type checking
+local ok = '-\t'
+local fail = 'fail '
+local needcheck = 'needcheck '
+local badmsg = 'badmsg '
+
akey = 'aa'
astring = 'abc'
@@ -11,12 +16,12 @@ aboolean = true
atable = {[akey]=456}
afunction = function() end
anil = nil
+athread = coroutine.create(afunction)
-anylua = { anil, astring, anumber, aboolean, atable, afunction }
+anylua = { nil, astring, anumber, aboolean, atable, afunction, athread }
-somestring = { astring }
-somenumber = { anumber }
-somestrnum = { anumber, astrnum }
+somestring = { astring, anumber }
+somenumber = { anumber, astrnum }
someboolean = { aboolean }
sometable = { atable }
somefunction = { afunction }
@@ -24,36 +29,21 @@ somenil = { anil }
somekey = { akey }
notakey = { astring, anumber, aboolean, atable, afunction }
-local function contains(set,val)
- local m = #set
- for i=1,m do
- if set[i] == val then
- return true
- end
- end
- return val == nil
-end
-
-local function except(some)
- local n = #anylua
- local z = {}
- local j = 1
- for i=1,n do
- if not contains(some, anylua[i]) then
- z[j] = anylua[i]
- j = j + 1
- end
- end
- return z
-end
+notastring = { nil, aboolean, atable, afunction, athread }
+notanumber = { nil, astring, aboolean, atable, afunction, athread }
+notaboolean = { nil, astring, anumber, atable, afunction, athread }
+notatable = { nil, astring, anumber, aboolean, afunction, athread }
+notafunction = { nil, astring, anumber, aboolean, atable, athread }
+notathread = { nil, astring, anumber, aboolean, atable, afunction }
+notanil = { astring, anumber, aboolean, atable, afunction, athread }
-notastring = except(somestring)
-notanumber = except(somenumber)
-notastrnum = except(somestrnum)
-notaboolean = except(someboolean)
-notatable = except(sometable)
-notafunction = except(somefunction)
-notanil = except(somenil)
+nonstring = { aboolean, atable, afunction, athread }
+nonnumber = { astring, aboolean, atable, afunction, athread }
+nonboolean = { astring, anumber, atable, afunction, athread }
+nontable = { astring, anumber, aboolean, afunction, athread }
+nonfunction = { astring, anumber, aboolean, atable, athread }
+nonthread = { astring, anumber, aboolean, atable, afunction }
+nonkey = { astring, anumber, aboolean, atable, afunction }
local structtypes = {
['table']='
',
@@ -108,33 +98,6 @@ local function arglists(typesets)
return ipairs(argsets)
end
---[[
-local function expand(arglists,fixed,varying,...)
- for i=1,#varying do
- local f = dup(fixed)
-
- end
-end
-
-local function arglists(typesets)
- local argsets = {}
- local args={}
- local n = typesets and #typesets or 0
- if n == 0 then
- table.insert( argsets, args )
- end
- for i=1,n do
- local t = typesets[i]
- for j=1,#t do
- args[i] = t[j]
- if i == n then
- table.insert( argsets, duptable(args) )
- end
- end
- end
- return ipairs(argsets)
-end
---]]
local function lookup( name )
return loadstring('return '..name)()
@@ -155,11 +118,6 @@ local function subbanner(name)
print( '--- '..tostring(name) )
end
-local ok = 'ok '
-local fail = 'fail '
-local needcheck = 'needcheck '
-local badmsg = 'badmsg '
-
-- check that all combinations of arguments pass
function checkallpass( name, typesets )
subbanner('checkallpass')
@@ -174,21 +132,6 @@ function checkallpass( name, typesets )
end
end
--- check that all combinations of arguments fail in some way,
--- ignore error messages
-function checkallfail( name, typesets )
- subbanner('checkallfail')
- for i,v in arglists(typesets) do
- local sig = signature(name,v)
- local s,e = invoke( name, v )
- if not s then
- print( ok, sig )
- else
- print( needcheck, sig, e )
- end
- end
-end
-
-- check that all combinations of arguments fail in some way,
-- ignore error messages
function checkallerrors( name, typesets, template )
diff --git a/src/test/errors/baselibargs.lua b/src/test/errors/baselibargs.lua
index fd3ba134..2aa30e0d 100644
--- a/src/test/errors/baselibargs.lua
+++ b/src/test/errors/baselibargs.lua
@@ -3,136 +3,138 @@ require 'args'
-- arg types for basic library functions
-local somestrnumnil={anil,astring,anumber}
-local notastrnumnil={aboolean,atable,afunction}
-- assert
banner('assert')
checkallpass('assert',{{true,123},anylua})
-checkallfail('assert',{{nil,false},{nil,'message'}})
checkallerrors('assert',{{nil,false},{nil}},'assertion failed')
checkallerrors('assert',{{nil,false},{'message'}},'message')
-- collectgarbage
banner('collectgarbage')
checkallpass('collectgarbage',{{'collect','count'}})
-checkallerrors('collectgarbage',{notanil},'bad argument')
+checkallerrors('collectgarbage',{notanil},'bad argument #1')
--- dofila
+-- dofile
banner('dofile')
-checkallpass('dofile', {{nil,'src/test/errors/args.lua','args.lua'}})
-checkallerrors('dofile', {notastrnumnil}, 'bad argument')
+checkallpass('dofile', {{nil,'src/test/errors/args.lua'}})
+checkallerrors('dofile', {{'args.lua'}}, 'cannot open args.lua')
+checkallerrors('dofile', {nonstring}, 'bad argument #1')
-- error
banner('error')
-checkallfail('error', {anylua,{nil,0,1,2}})
-checkallerrors('dofile', {{'message'},{nil,0,1,2}}, 'message')
-checkallerrors('dofile', {{123},{nil,1,2}}, 123)
+checkallerrors('error', {{'message'},{nil,0,1,2}}, 'message')
+checkallerrors('error', {{123},{nil,1,2}}, 123)
-- getfenv
banner('getfenv')
checkallpass('getfenv', {{nil,print,function()end,0,1,2}})
-checkallerrors('getfenv', {{true,{},'abc'}}, 'bad argument')
+checkallerrors('getfenv', {{true,{},'abc'}}, 'bad argument #1')
-- getmetatable
banner('getmetatable')
checkallpass('getmetatable', {notanil})
-checkallerrors('getmetatable',{},'bad argument')
+checkallerrors('getmetatable',{},'bad argument #1')
-- ipairs
banner('ipairs')
checkallpass('ipairs', {sometable})
-checkallerrors('ipairs', {notatable}, 'bad argument')
+checkallerrors('ipairs', {notatable}, 'bad argument #1')
-- load
banner('load')
-checkallpass('load', {somefunction,{anil,astring}})
-checkallerrors('load', {notafunction,{anil,astring,anumber}}, 'bad argument')
-checkallerrors('load', {somefunction,{afunction,atable}}, 'bad argument')
+checkallpass('load', {somefunction,{nil,astring}})
+checkallerrors('load', {notafunction,{nil,astring,anumber}}, 'bad argument #1')
+checkallerrors('load', {somefunction,{afunction,atable}}, 'bad argument #2')
-- loadfile
banner('loadfile')
-checkallerrors('loadfile', {notastring}, 'bad argument')
+checkallpass('loadfile', {})
+checkallerrors('loadfile', {nonstring}, 'bad argument #1')
-- loadstring
banner('loadstring')
-checkallpass('loadstring', {{'return'},{anil,astring}})
-checkallerrors('loadstring', {notastring,{anil,astring,anumber}}, 'bad argument')
-checkallerrors('loadstring', {{'return'},{afunction,atable}}, 'bad argument')
+checkallpass('loadstring', {{'return'},{nil,astring}})
+checkallerrors('loadstring', {notastring,{nil,astring,anumber}}, 'bad argument #1')
+checkallerrors('loadstring', {{'return'},{afunction,atable}}, 'bad argument #2')
-- next
banner('next')
--- checkallpass('next', {{{aa=11}},{nil,'aa'}})
checkallpass('next', {sometable,somekey})
-checkallerrors('next', {notatable,{nil,1}}, 'bad argument')
-checkallerrors('next', {sometable,notakey}, 'invalid key')
+checkallerrors('next', {notatable,{nil,1}}, 'bad argument #1')
+checkallerrors('next', {sometable,nonkey}, 'invalid key')
-- pairs
banner('pairs')
checkallpass('pairs', {sometable})
-checkallerrors('pairs', {notatable}, 'bad argument')
+checkallerrors('pairs', {notatable}, 'bad argument #1')
-- pcall
banner('pcall')
checkallpass('pcall', {notanil,anylua})
-checkallerrors('pcall',{},'bad argument')
+checkallerrors('pcall',{},'bad argument #1')
-- print
banner('print')
checkallpass('print', {})
-checkallpass('print', {{anil,astring,anumber,aboolean}})
+checkallpass('print', {{nil,astring,anumber,aboolean}})
-- rawequal
banner('rawequal')
checkallpass('rawequal', {notanil,notanil})
-checkallerrors('rawequal', {notanil}, 'bad argument')
-checkallerrors('rawequal', {}, 'bad argument')
+checkallerrors('rawequal', {}, 'bad argument #1')
+checkallerrors('rawequal', {notanil}, 'bad argument #2')
-- rawget
banner('rawget')
checkallpass('rawget', {sometable,somekey})
-checkallpass('rawget', {sometable,notakey})
-checkallerrors('rawget', {notatable,notakey}, 'bad argument')
-checkallerrors('rawget', {}, 'bad argument')
+checkallpass('rawget', {sometable,nonkey})
+checkallerrors('rawget', {sometable,somenil},'bad argument #2')
+checkallerrors('rawget', {notatable,notakey}, 'bad argument #1')
+checkallerrors('rawget', {}, 'bad argument #1')
-- rawset
banner('rawset')
checkallpass('rawset', {sometable,somekey,notanil})
-checkallpass('rawset', {sometable,notakey,notanil})
-checkallerrors('rawset', {sometable,somekey}, 'bad argument')
-checkallerrors('rawset', {notatable,somestring,somestring}, 'bad argument')
-checkallerrors('rawset', {}, 'bad argument')
+checkallpass('rawset', {sometable,nonkey,notanil})
+checkallerrors('rawset', {sometable,somenil},'table index is nil')
+checkallerrors('rawset', {}, 'bad argument #1')
+checkallerrors('rawset', {notatable,somestring,somestring}, 'bad argument #1')
+checkallerrors('rawset', {sometable,somekey}, 'bad argument #3')
-- select
banner('select')
checkallpass('select', {{anumber,'#'},anylua})
-checkallerrors('select', {notanumber}, 'bad argument')
+checkallerrors('select', {notanumber}, 'bad argument #1')
-- setfenv
banner('setfenv')
checkallpass('setfenv', {{function()end},sometable})
-checkallerrors('setfenv', {{function()end}}, 'bad argument')
-checkallerrors('setfenv', {{function()end},notatable}, 'bad argument')
+checkallerrors('setfenv', {{1.23, '1.33'},{getfenv()}}, 'cannot change environment of given object')
+checkallerrors('setfenv', {{atable,athread,aboolean,astring},sometable}, 'bad argument #1')
+checkallerrors('setfenv', {notafunction}, 'bad argument #2')
+checkallerrors('setfenv', {anylua}, 'bad argument #2')
+checkallerrors('setfenv', {{function()end},notatable}, 'bad argument #2')
-- setmetatable
banner('setmetatable')
checkallpass('setmetatable', {sometable,sometable})
-checkallpass('setmetatable', {sometable,{anil,atable},{'anchor'}})
-checkallerrors('setmetatable',{notatable,sometable},'bad argument')
-checkallerrors('setmetatable',{sometable,notatable},'bad argument')
+checkallpass('setmetatable', {sometable,{nil,atable},{'anchor'}})
+checkallerrors('setmetatable',{notatable,sometable},'bad argument #1')
+checkallerrors('setmetatable',{sometable,notatable},'bad argument #2')
-- tonumber
banner('tonumber')
-checkallpass('tonumber',{somestrnum,{nil,2,10,36}})
-checkallpass('tonumber',{notastrnum,{nil,10}})
-checkallerrors('tonumber',{notastrnum,{2,9,11,36}},'bad argument')
-checkallerrors('tonumber',{somestrnum,{1,37,atable,afunction,aboolean}},'bad argument')
+checkallpass('tonumber',{somenumber,{nil,2,10,36}})
+checkallpass('tonumber',{notanil,{nil,10}})
+checkallerrors('tonumber',{{nil,afunction,atable},{2,9,11,36}},'bad argument #1')
+checkallerrors('tonumber',{somenumber,{1,37,atable,afunction,aboolean}},'bad argument #2')
-- tostring
banner('tostring')
checkallpass('tostring',{notanil})
checkallpass('tostring',{anylua,{'anchor'}})
-checkallerrors('tostring',{},'bad argument')
+checkallerrors('tostring',{},'bad argument #1')
-- type
banner('type')
@@ -142,12 +144,16 @@ checkallerrors('type',{},'bad argument')
-- unpack
banner('unpack')
-checkallpass('unpack',{sometable,{nil,anumber,astrnum},{nil,anumber,astrnum}})
-checkallerrors('unpack',{notatable,{nil,anumber,astrnum},{nil,anumber,astrnum}},'bad argument')
+checkallpass('unpack',{sometable})
+checkallpass('unpack',{sometable,somenumber})
+checkallpass('unpack',{sometable,somenumber,somenumber})
+checkallerrors('unpack',{notatable,somenumber,somenumber},'bad argument #1')
+checkallerrors('unpack',{sometable,nonnumber,somenumber},'bad argument #2')
+checkallerrors('unpack',{sometable,somenumber,nonnumber},'bad argument #3')
-- xpcall
banner('xpcall')
checkallpass('xpcall', {notanil,notanil})
-checkallerrors('xpcall',{},'bad argument')
+checkallerrors('xpcall',{anylua},'bad argument #2')
diff --git a/src/test/errors/coroutinelibargs.lua b/src/test/errors/coroutinelibargs.lua
index 15669002..443bcc92 100644
--- a/src/test/errors/coroutinelibargs.lua
+++ b/src/test/errors/coroutinelibargs.lua
@@ -12,7 +12,7 @@ checkallerrors('coroutine.create',{notafunction},'bad argument')
banner('coroutine.resume')
local co = coroutine.create(function() while true do coroutine.yield() end end)
checkallpass('coroutine.resume',{{co},anylua})
-checkallerrors('coroutine.resume',{anylua},'bad argument')
+checkallerrors('coroutine.resume',{notathread},'bad argument #1')
-- coroutine.running
banner('coroutine.running')
@@ -21,12 +21,12 @@ checkallpass('coroutine.running',{anylua})
-- coroutine.status
banner('coroutine.status')
checkallpass('coroutine.status',{{co}})
-checkallerrors('coroutine.status',{anylua},'bad argument')
+checkallerrors('coroutine.status',{notathread},'bad argument #1')
-- coroutine.wrap
banner('coroutine.wrap')
checkallpass('coroutine.wrap',{somefunction})
-checkallerrors('coroutine.wrap',{notafunction},'bad argument')
+checkallerrors('coroutine.wrap',{notafunction},'bad argument #1')
-- coroutine.yield
banner('coroutine.yield')
diff --git a/src/test/errors/mathlibargs.lua b/src/test/errors/mathlibargs.lua
index 25be2438..76833740 100644
--- a/src/test/errors/mathlibargs.lua
+++ b/src/test/errors/mathlibargs.lua
@@ -3,7 +3,7 @@ require 'args'
-- arg type tests for math library functions
local somenumber = {23,45.67,'-12','-345.678'}
-local notanumber = {nil,astring,aboolean,afunction,atable}
+local notanumber = {nil,astring,aboolean,afunction,atable,athread}
local nonnumber = {astring,aboolean,afunction,atable}
local singleargfunctions = {
diff --git a/src/test/errors/modulelibargs.lua b/src/test/errors/modulelibargs.lua
index f5ab3105..5a55b169 100644
--- a/src/test/errors/modulelibargs.lua
+++ b/src/test/errors/modulelibargs.lua
@@ -23,7 +23,7 @@ checkallerrors('package.seeall',{notatable},'bad argument')
-- module (last because it pretty much breaks this chunk)
print( pcall( function()
banner('module')
- checkallpass('module',{somestrnum,{package.seeall},{nil,afunction}})
+ checkallpass('module',{somenumber,{package.seeall},{nil,afunction}})
checkallerrors('module',{{aboolean,atable,afunction}},'bad argument')
checkallerrors('module',{{aboolean,atable,afunction},{package.seeall}},'bad argument')
checkallerrors('module',{somestring,{astring,anumber,aboolean,atable}},'attempt to call a')
diff --git a/src/test/errors/stringlibargs.lua b/src/test/errors/stringlibargs.lua
index 2b8b76cb..32e91062 100644
--- a/src/test/errors/stringlibargs.lua
+++ b/src/test/errors/stringlibargs.lua
@@ -2,10 +2,6 @@ package.path = "?.lua;src/test/errors/?.lua"
require 'args'
-- arg type tests for string library functions
-local somestring = {astring,anumber}
-local notastring = {nil,aboolean,afunction,atable}
-local somenumber = {ainteger,adouble,tostring(ainteger),tostring(adouble)}
-local notanumber = {nil,astring,aboolean,afunction,atable}
-- string.byte
banner('string.byte')
@@ -17,8 +13,10 @@ checkallerrors('string.byte',{notastring,{nil,111}},'bad argument')
banner('string.char')
checkallpass('string.char',{{nil,0,1,40,127,128,255,'0','1','255','1.2',1.2}})
checkallpass('string.char',{{0,127,255},{0,127,255}})
-checkallerrors('string.char',{{-1,256}},'bad argument')
-checkallerrors('string.char',{notanumber,notanumber},'bad argument')
+checkallpass('string.char',{})
+checkallerrors('string.char',{{-1,256}},'bad argument #1')
+checkallerrors('string.char',{notanumber,{23,'45',6.7}},'bad argument #1')
+checkallerrors('string.char',{{23,'45',6.7},nonnumber},'bad argument #2')
-- string.dump
banner('string.dump')
@@ -30,74 +28,74 @@ banner('string.find')
checkallpass('string.find',{somestring,somestring})
checkallpass('string.find',{somestring,somestring,{nil,-3,3}})
checkallpass('string.find',{somestring,somestring,somenumber,anylua})
-checkallerrors('string.find',{somestring,notastring},'bad argument')
-checkallerrors('string.find',{notastring,somestring},'bad argument')
-checkallerrors('string.find',{somestring,somestring,notanumber},'bad argument')
+checkallerrors('string.find',{notastring,somestring},'bad argument #1')
+checkallerrors('string.find',{somestring,notastring},'bad argument #2')
+checkallerrors('string.find',{somestring,somestring,nonnumber},'bad argument #3')
-- string.format
local numfmts = {'%c','%d','%E','%e','%f','%g','%G','%i','%o','%u','%X','%x'}
local strfmts = {'%q','%s'}
banner('string.format')
checkallpass('string.format',{somestring,anylua})
-checkallpass('string.format',{numfmts,{ainteger,adouble,astrnum}})
-checkallpass('string.format',{strfmts,{astring,ainteger,adouble,astrnum}})
-checkallerrors('string.format',{numfmts,notastring},'bad argument')
-checkallerrors('string.format',{strfmts,notastring},'bad argument')
+checkallpass('string.format',{numfmts,somenumber})
+checkallpass('string.format',{strfmts,somestring})
+checkallerrors('string.format',{numfmts,notanumber},'bad argument #2')
+checkallerrors('string.format',{strfmts,notastring},'bad argument #2')
-- string.gmatch
banner('string.gmatch')
checkallpass('string.gmatch',{somestring,somestring})
-checkallerrors('string.gmatch',{somestring,notastring},'bad argument')
-checkallerrors('string.gmatch',{notastring,somestring},'bad argument')
+checkallerrors('string.gmatch',{notastring,somestring},'bad argument #1')
+checkallerrors('string.gmatch',{somestring,notastring},'bad argument #2')
-- string.gsub
local somerepl = {astring,atable,afunction}
local notarepl = {nil,aboolean}
banner('string.gsub')
checkallpass('string.gsub',{somestring,somestring,somerepl,{nil,-1}})
-checkallerrors('string.gsub',{notastring,somestring,somerepl},'bad argument')
-checkallerrors('string.gsub',{somestring,notastring,somerepl},'bad argument')
-checkallerrors('string.gsub',{{astring},{astring},notarepl},'bad argument')
-checkallerrors('string.gsub',{{astring},{astring},somerepl,notanumber},'bad argument')
+checkallerrors('string.gsub',{notastring,somestring,somerepl},'bad argument #1')
+checkallerrors('string.gsub',{somestring,notastring,somerepl},'bad argument #2')
+checkallerrors('string.gsub',{{astring},{astring},notarepl},'bad argument #3')
+checkallerrors('string.gsub',{{astring},{astring},somerepl,nonnumber},'bad argument #4')
-- string.len
banner('string.len')
checkallpass('string.len',{somestring})
-checkallerrors('string.len',{notastring},'bad argument')
+checkallerrors('string.len',{notastring},'bad argument #1')
-- string.lower
banner('string.lower')
checkallpass('string.lower',{somestring})
-checkallerrors('string.lower',{notastring},'bad argument')
+checkallerrors('string.lower',{notastring},'bad argument #1')
-- string.match
banner('string.match')
checkallpass('string.match',{somestring,somestring})
checkallpass('string.match',{somestring,somestring,{nil,-3,3}})
-checkallerrors('string.match',{somestring,notastring},'bad argument')
-checkallerrors('string.match',{notastring,somestring},'bad argument')
-checkallerrors('string.match',{somestring,somestring,notanumber},'bad argument')
+checkallerrors('string.match',{notastring,somestring},'bad argument #1')
+checkallerrors('string.match',{somestring,notastring},'bad argument #2')
+checkallerrors('string.match',{somestring,somestring,notanumber},'bad argument #3')
-- string.reverse
banner('string.reverse')
checkallpass('string.reverse',{somestring})
-checkallerrors('string.reverse',{notastring},'bad argument')
+checkallerrors('string.reverse',{notastring},'bad argument #1')
-- string.rep
banner('string.rep')
checkallpass('string.rep',{somestring,somenumber})
-checkallerrors('string.rep',{notastring,somenumber},'bad argument')
-checkallerrors('string.rep',{somestring,notanumber},'bad argument')
+checkallerrors('string.rep',{notastring,somenumber},'bad argument #1')
+checkallerrors('string.rep',{somestring,notanumber},'bad argument #2')
-- string.sub
banner('string.sub')
checkallpass('string.sub',{somestring,somenumber,somenumber})
-checkallerrors('string.sub',{notastring,somenumber,somenumber},'bad argument')
-checkallerrors('string.sub',{somestring,notanumber,somenumber},'bad argument')
-checkallerrors('string.sub',{somestring,somenumber,notanumber},'bad argument')
+checkallerrors('string.sub',{notastring,somenumber,somenumber},'bad argument #1')
+checkallerrors('string.sub',{somestring,notanumber,somenumber},'bad argument #2')
+checkallerrors('string.sub',{somestring,somenumber,nonnumber},'bad argument #3')
-- string.upper
banner('string.upper')
checkallpass('string.upper',{somestring})
-checkallerrors('string.upper',{notastring},'bad argument')
+checkallerrors('string.upper',{notastring},'bad argument #1')