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.

136 lines
3.8 KiB

-- AceTimer test suite 2: Errors
dofile("wow_api.lua")
dofile("LibStub.lua")
local MAJOR = "AceTimer-3.0"
dofile("../"..MAJOR.."/"..MAJOR..".lua")
local AceTimer,minor = LibStub:GetLibrary(MAJOR)
-- NOTE, the below pcalls should NOT contain error position information.
-- The reason is that if the error level is correctly set, it will point to _inside_ the pcall(), which does not have a position
-------------------------------------------------------------------
-- Test ScheduleTimer errorchecking of method
obj = {}
ok,msg = pcall(AceTimer.ScheduleTimer, obj, "method", 4, "arg") -- This should fail - method not defined
assert(not ok)
assert(msg == MAJOR..": ScheduleTimer(\"methodName\", delay, arg): 'methodName' - method not found on target object.", msg)
obj.method = "hi, i'm NOT a function, i'm something else"
ok,msg = pcall(AceTimer.ScheduleTimer, obj, "method", 4, "arg") -- This should fail - obj["method"] is not a function
assert(not ok)
assert(msg == MAJOR..": ScheduleTimer(\"methodName\", delay, arg): 'methodName' - method not found on target object.", msg)
ok,msg = pcall(AceTimer.ScheduleTimer, obj, nil, 4, "arg") -- This should fail (method is nil)
assert(not ok)
assert(msg == MAJOR..": ScheduleTimer(callback, delay, arg): 'callback' - function or method name expected.", msg)
ok,msg = pcall(AceTimer.ScheduleTimer, obj, {}, 4, "arg") -- This should fail (method is table)
assert(not ok)
assert(msg == MAJOR..": ScheduleTimer(callback, delay, arg): 'callback' - function or method name expected.", msg)
-- (Note: ScheduleRepeatingTimer here just to check naming)
ok,msg = pcall(AceTimer.ScheduleRepeatingTimer, obj, 123, 4, "arg") -- This should fail too (method is integer)
assert(not ok)
assert(msg == MAJOR..": ScheduleRepeatingTimer(callback, delay, arg): 'callback' - function or method name expected.", msg)
-------------------------------------------------------------------
-- Check AceTimer:CancelAllTimers() -- not allowed
ok,msg = pcall(AceTimer.CancelAllTimers, AceTimer)
assert(not ok)
assert(msg == MAJOR..": CancelAllTimers(): supply a meaningful 'self'", dump(msg))
-------------------------------------------------------------------
-- Scheduling a timer on a member function that later becomes a nonfunction
cnt=0
obj.method = function() cnt=cnt+1 end
AceTimer.ScheduleRepeatingTimer(obj, "method", 1, "arg")
WoWAPI_FireUpdate(2) -- Border case: at this exact bucket, we should be able to convince the timer to fire twice even though it only gets a single onupdate
assert(cnt==2, cnt) -- This should have worked nicely
errors=0
function geterrorhandler()
return function(msg)
errors=errors+1
assert(strmatch(msg, "a string value"))
end
end
obj.method = "this should cause errors"
WoWAPI_FireUpdate(4)
assert(errors==2) -- timer should have run twice
-----------------------------------------------------------------------
-- :CancelTimer() on something that's already cancelled / never existed
local handle = AceTimer.ScheduleTimer(obj, function() assert("this shouldnt run") end, 1)
AceTimer.CancelTimer(obj, handle) -- Should work
errors=0
function geterrorhandler()
return function(msg)
errors=errors+1
assert(strmatch(msg, "already cancelled"))
end
end
AceTimer.CancelTimer(obj, handle) -- Should error -- already cancelled
assert(errors==1)
WoWAPI_FireUpdate(6) -- Let the timer disappear from the buckets
errors=0
function geterrorhandler()
return function(msg)
errors=errors+1
assert(strmatch(msg, "no such timer"))
end
end
AceTimer.CancelTimer(obj, handle) -- Should error -- doesnt exist at all
assert(errors==1)
function geterrorhandler()
return function(msg)
error("This shouldn't have errored! -- "..msg)
end
end
AceTimer.CancelTimer(obj, handle, true) -- silent: shouldn't error
-----------------------------------------------------------------------
print "OK"