class LoopingCallTest(unittest.TestCase): default_args = (10, 'hello') default_kwargs = {'a': 47, 'b': 'c'} def setUp(self): self.clock = Clock() self.obj = ModifiedObject() self.sc = LoopingCall(self.obj.func, clock=self.clock, *self.default_args, **self.default_kwargs) def _check(self, args, kwargs): if args is None: self.assertIsNone(self.obj.args) else: self.assertTupleEqual(self.obj.args, args) if kwargs is None: self.assertIsNone(self.obj.kwargs) else: self.assertEqual(self.obj.kwargs, kwargs) def test_init(self): # test initializing LoopingCall without overriding its clock sc = LoopingCall(self.obj.func, *self.default_args, **self.default_kwargs) sc.schedule() sc.cancel() def test_basic(self): # scheduling self.assertFalse(self.sc.is_scheduled()) self.sc.schedule(2, count=2, now=False) # before the first call self.assertTrue(self.sc.is_scheduled()) self.assertEqual(self.sc.get_time(), 2) self.assertEqual(self.sc.calls_left(), 2) self.clock.advance(1) self.assertEqual(self.obj.num_calls, 0) # after the first call self.clock.advance(1) self.assertEqual(self.obj.num_calls, 1) self.assertEqual(self.sc.calls_left(), 1) self._check(self.default_args, self.default_kwargs) # after the second call self.clock.advance(2) self.assertEqual(self.obj.num_calls, 2) self.assertEqual(self.sc.calls_left(), 0) self.assertFalse(self.sc.is_scheduled()) # no more calls self.clock.advance(20) self.assertEqual(self.obj.num_calls, 2) def test_now(self): self.sc.schedule(2, count=2, now=True) self.assertEqual(self.obj.num_calls, 0) self.clock.advance(0) self.assertEqual(self.obj.num_calls, 1) self.clock.advance(20) self.assertEqual(self.obj.num_calls, 2) def test_infinite(self): self.sc.schedule(2) self.clock.pump([2] * 100) self.assertEqual(self.obj.num_calls, 100) self.assertTrue(self.sc.is_scheduled()) self.assertIsNone(self.sc.calls_left()) def test_cancel(self): self.sc.schedule(2) self.clock.advance(1) self.sc.cancel() self.clock.advance(20) self.assertEqual(self.obj.num_calls, 0) def test_reschedule(self): self.sc.schedule(2) self.clock.advance(1) self.sc.schedule(5) self.clock.advance(4) self.assertEqual(self.obj.num_calls, 0) self.clock.advance(1) self.assertEqual(self.obj.num_calls, 1) def test_no_delay(self): self.sc.schedule() self.assertEqual(self.obj.num_calls, 0) self.clock.advance(0) self.assertEqual(self.obj.num_calls, 1) self.clock.advance(0) self.assertEqual(self.obj.num_calls, 2) def test_nested_schedule(self): def func(*args, **kwargs): self.obj.func(*args, **kwargs) self.sc.schedule() self.sc.func = func self.sc.schedule() self.assertEqual(self.obj.num_calls, 0) self.clock.advance(0) self.assertEqual(self.obj.num_calls, 1) self.clock.advance(0) self.assertEqual(self.obj.num_calls, 2)