def test_DyingListenersClass(): # Test notification callbacks when listener dies # test dead listener notification def onDead(weakListener): lsrs.remove(weakListener) def listener1(): pass def listener2(): pass def listener3(): pass lsrs = [] lsrs.append(Listener(listener1, ArgsInfoMock(False), onDead=onDead)) lsrs.append(Listener(listener2, ArgsInfoMock(False), onDead=onDead)) lsrs.append(Listener(listener3, ArgsInfoMock(False), onDead=onDead)) # now force some listeners to die, verify lsrs list assert len(lsrs) == 3 del listener1 gc.collect() # for pypy: the gc doesn't work the same as cpython's assert len(lsrs) == 2 assert lsrs[0] == listener2 assert lsrs[1] == listener3 del listener2 gc.collect() # for pypy: the gc doesn't work the same as cpython's assert len(lsrs) == 1 assert lsrs[0] == listener3 del listener3 gc.collect() # for pypy: the gc doesn't work the same as cpython's assert len(lsrs) == 0
def test_call(): aiMock = ArgsInfoMock() result = [] def fn(a, b, c=1, d=2, **e): result.append((a, b, c, d, e)) listener = Listener(fn, aiMock) listener(dict(a=123, b=456), 'test_topic') assert result[0] == (123, 456, 1, 2, {}) listener = Listener(fn, aiMock, curriedArgs=dict(b=4, d=5, f=6)) listener(dict(a=123), 'test_topic') assert result[1] == (123, 4, 1, 5, {'f': 6})
def test_DOAListeners_2(): # test DOA of tmp callable: def fn(): pass class Wrapper: def __init__(self, func): self.func = func def __call__(self): pass def onDead(listenerObj): pass # check dead-on-arrival when no death callback specified: doa1 = Listener(Wrapper(fn), ArgsInfoMock()) gc.collect() # for pypy: the gc doesn't work the same as cpython's assert doa1.getCallable() is None assert doa1.isDead() pytest.raises(RuntimeError, doa1, None, {}) # check dead-on-arrival when a death callback specified: doa2 = Listener(Wrapper(fn), ArgsInfoMock(), onDead) gc.collect() # for pypy: the gc doesn't work the same as cpython's assert doa2.getCallable() is None assert doa2.isDead() pytest.raises(RuntimeError, doa2, None, {})
def test_ListenerEq(): # Test equality tests of two listeners def listener1(): pass def listener2(): pass l1 = Listener(listener1, ArgsInfoMock()) l2 = Listener(listener2, ArgsInfoMock()) # verify that Listener can be compared for equality to another Listener, weakref, or callable assert l1 == l1 assert l1 != l2 assert l1 == listener1 assert l1 != listener2 ll = [l1] assert listener1 in ll assert listener2 not in ll assert ll.index(listener1) == 0 # now for class method listener: class MyListener: def __call__(self): pass def meth(self): pass listener3 = MyListener() l3 = Listener(listener3, ArgsInfoMock()) assert l3 != l1 assert l3 != l2 assert l3 != listener2 assert l3 == l3 assert l3 == listener3 assert l3 != listener3.__call__ l4 = Listener(listener3.meth, ArgsInfoMock()) assert l4 == l4 assert l4 != l3 assert l4 != l2 assert l4 != listener3.__call__ assert l4 == listener3.meth
def test_DOAListeners_2(): # test DOA of tmp callable: def fn(): pass class Wrapper: def __init__(self, func): self.func = func def __call__(self): pass def onDead(listenerObj): pass # check dead-on-arrival when no death callback specified: doa1 = Listener( Wrapper(fn), ArgsInfoMock() ) gc.collect() # for pypy: the gc doesn't work the same as cpython's assert doa1.getCallable() is None assert doa1.isDead() pytest.raises(RuntimeError, doa1, None, {}) # check dead-on-arrival when a death callback specified: doa2 = Listener( Wrapper(fn), ArgsInfoMock(), onDead ) gc.collect() # for pypy: the gc doesn't work the same as cpython's assert doa2.getCallable() is None assert doa2.isDead() pytest.raises(RuntimeError, doa2, None, {})
def test_testNaming(): aiMock = ArgsInfoMock() # define various type of listeners def fn(): pass class Foo: def __call__(self): pass def meth(self): pass ll = Listener(fn, aiMock) assert ll.typeName() == "fn" assert ll.module() == "test1_listener" assert not ll.wantsTopicObjOnCall() foo = Foo() ll = Listener(foo, aiMock) assert ll.typeName() == "Foo" assert ll.module() == "test1_listener" assert not ll.wantsTopicObjOnCall() ll = Listener(foo.meth, ArgsInfoMock('argName')) assert ll.typeName() == "Foo.meth" assert ll.module() == "test1_listener" assert ll.wantsTopicObjOnCall()
def getListener1(): class DOA: def tmpFn(self): pass return Listener(DOA.tmpFn, ArgsInfoMock())