diff --git a/evennia/scripts/taskhandler.py b/evennia/scripts/taskhandler.py index 1fd8a211f1..11ac144a94 100644 --- a/evennia/scripts/taskhandler.py +++ b/evennia/scripts/taskhandler.py @@ -29,11 +29,17 @@ class TaskHandler(object): `evennia.scripts.taskhandler.TASK_HANDLER`, which contains one instance of this class, and use its `add` and `remove` methods. + Dev notes: + deferLater creates an instance of IDelayedCall using reactor.callLater. + deferLater uses the cancel method on the IDelayedCall instance to create + the defer instance it returns. + """ def __init__(self): self.tasks = {} self.to_save = {} + self.clock = reactor def load(self): """Load from the ServerConfig. @@ -170,10 +176,10 @@ class TaskHandler(object): callback = self.do_task args = [task_id] kwargs = {} - deferLater(reactor, timedelay, callback, *args, **kwargs) + deferLater(self.clock, timedelay, callback, *args, **kwargs) return task_id - return deferLater(reactor, timedelay, callback, *args, **kwargs) + return deferLater(self.clock, timedelay, callback, *args, **kwargs) def remove(self, task_id): """Remove a persistent task without executing it. @@ -219,7 +225,7 @@ class TaskHandler(object): now = datetime.now() for task_id, (date, callbac, args, kwargs) in self.tasks.items(): seconds = max(0, (date - now).total_seconds()) - deferLater(reactor, seconds, self.do_task, task_id) + deferLater(self.clock, seconds, self.do_task, task_id) # Create the soft singleton diff --git a/evennia/utils/tests/test_utils.py b/evennia/utils/tests/test_utils.py index b1a97c984d..ea23601fce 100644 --- a/evennia/utils/tests/test_utils.py +++ b/evennia/utils/tests/test_utils.py @@ -326,9 +326,15 @@ class TestDelay(EvenniaTest): global _TASK_HANDLER if _TASK_HANDLER is None: from evennia.scripts.taskhandler import TASK_HANDLER as _TASK_HANDLER + _TASK_HANDLER.clock = task.Clock() self.char1.ndb.dummy_var = False - # test a persistent deferral + # test a persistent deferral, that completes after delay time task_id = utils.delay(1, dummy_func, self.char1.dbref, persistent=True) - _TASK_HANDLER.do_task(task_id) # run the deferred task + _TASK_HANDLER.clock.advance(1) # make time pass + self.assertEqual(self.char1.ndb.dummy_var, 'dummy_func ran') + self.char1.ndb.dummy_var = False + # test a non persisten deferral, that completes after delay time. + deferal_inst = utils.delay(1, dummy_func, self.char1.dbref) + _TASK_HANDLER.clock.advance(1) # make time pass self.assertEqual(self.char1.ndb.dummy_var, 'dummy_func ran') self.char1.ndb.dummy_var = False