def test_emit_receiveOnce(self): """ Events should only be received by each object once. """ world = World(MagicMock()) obj1 = world.create('foo')['id'] obj2 = world.create('foo')['id'] obj1_received = [] world.receiveFor(obj1, obj1_received.append) obj2_received = [] world.receiveFor(obj2, obj2_received.append) # obj1 emits everything it receives world.receiveFor(obj1, world.emitterFor(obj1)) # obj2 emits everything it receives world.receiveFor(obj2, world.emitterFor(obj2)) # obj2 receives emissions from obj1 world.subscribeTo(obj1, world.receiverFor(obj2)) # obj1 receives emissions from obj2 world.subscribeTo(obj2, world.receiverFor(obj1)) # we have a nice loop set up. When this test fails, it is likely to # continue spinning forever. world.emit('echo', obj1) self.assertEqual(obj1_received, ['echo'], "Should have received the " "message once") self.assertEqual(obj2_received, ['echo'], "Should have received the " "message once")
def test_emitterFor_same(self): """ You should get the same function each time you ask for an emitter for the same object. """ world = World(MagicMock()) self.assertEqual(world.emitterFor('foo'), world.emitterFor('foo'))
def test_destroy_disableSubscribers(self): """ When an object is destroyed, things subscribed to its events will no longer receive events. """ world = World(MagicMock()) thing = world.create('foo') received = [] world.receiveFor(thing['id'], received.append) emitted = [] world.subscribeTo(thing['id'], emitted.append) receiver = world.receiverFor(thing['id']) emitter = world.emitterFor(thing['id']) world.destroy(thing['id']) received.pop() emitted.pop() receiver('foo') self.assertEqual(received, []) self.assertEqual(emitted, []) emitter('foo') self.assertEqual(received, []) self.assertEqual(emitted, [])
def test_emitterFor(self): """ You can get a function that takes a single argument and emits events for a particular object. """ ev1 = MagicMock() world = World(ev1) ev2 = MagicMock() world.subscribeTo('1234', ev2) emitter = world.emitterFor('1234') emitter('foo') ev1.assert_called_once_with('foo') ev2.assert_called_once_with('foo')