def test_callback(self): log = [] callbacks = misc.Callbacks() # add foo def foo(): log.append("foo") callbacks.add(foo) # add bar @callbacks.add def bar(): log.append("bar") # add foo again callbacks.add(foo) # this should call foo(), bar(), foo() callbacks.run() self.assertEqual(log, ["foo", "bar", "foo"]) # this should do nothing callbacks.run() self.assertEqual(log, ["foo", "bar", "foo"])
def test_aggregate(self): log = [] callbacks = misc.Callbacks() # register foo once @callbacks.add def foo(): log.append(callbacks.data["foo"]) # aggregate data callbacks.data.setdefault("foo", []).append(1) callbacks.data.setdefault("foo", []).append(2) callbacks.data.setdefault("foo", []).append(3) # foo() is called once callbacks.run() self.assertEqual(log, [[1, 2, 3]]) self.assertFalse(callbacks.data) callbacks.run() self.assertEqual(log, [[1, 2, 3]])
def test_reentrant(self): log = [] callbacks = misc.Callbacks() # register foo that runs callbacks @callbacks.add def foo(): log.append("foo1") callbacks.run() log.append("foo2") @callbacks.add def bar(): log.append("bar") # both foo() and bar() are called once callbacks.run() self.assertEqual(log, ["foo1", "bar", "foo2"]) callbacks.run() self.assertEqual(log, ["foo1", "bar", "foo2"])