def testInstanceOverride(self) -> None: Before(self.a.foo, self.before) After(self.a.foo, self.after) self.a.foo(1) assert self.foo_called == (self.a, 1) assert self.after_called == (1, ) assert self.before_called == (1, ) assert self.after_count == 1 assert self.before_count == 1 self.b.foo(2) assert self.foo_called == (self.b, 2) assert self.after_called == (1, ) assert self.before_called == (1, ) assert self.after_count == 1 assert self.before_count == 1 assert Remove(self.a.foo, self.before) == True self.a.foo(2) assert self.foo_called == (self.a, 2) assert self.after_called == (2, ) assert self.before_called == (1, ) assert self.after_count == 2 assert self.before_count == 1 Before(self.a.foo, self.before) Before(self.a.foo, self.before) # Registering twice has no effect the 2nd time self.a.foo(5) assert self.before_called == (5, ) assert self.before_count == 2
def testClassOverride(self) -> None: Before(C.foo, self.before) After(C.foo, self.after) self.a.foo(1) assert self.foo_called == (self.a, 1) assert self.after_called == (self.a, 1) assert self.after_count == 1 assert self.before_called == (self.a, 1) assert self.before_count == 1 self.b.foo(2) assert self.foo_called == (self.b, 2) assert self.after_called == (self.b, 2) assert self.after_count == 2 assert self.before_called == (self.b, 2) assert self.before_count == 2 assert Remove(C.foo, self.before) self.a.foo(3) assert self.foo_called == (self.a, 3) assert self.after_called == (self.a, 3) assert self.after_count == 3 assert self.before_called == (self.b, 2) assert self.before_count == 2
def testAfterBeforeHandleError(self) -> None: class C: def Method(self, x): return x * 2 def AfterMethod(*args): self.after_called += 1 raise RuntimeError def BeforeMethod(*args): self.before_called += 1 raise RuntimeError self.before_called = 0 self.after_called = 0 c = C() Before(c.Method, BeforeMethod) After(c.Method, AfterMethod) # Now behavior changed and it will fail on first callback error with pytest.raises(RuntimeError): assert c.Method(10) == 20 assert self.before_called == 1 assert self.after_called == 0
def testBoundMethodsRight(self) -> None: foo = self.a.foo foo = Before(foo, self.before) foo = After(foo, self.after) foo(10) assert self.before_count == 1 assert self.after_count == 1
def testBoundMethodsWrong(self) -> None: foo = self.a.foo Before(foo, self.before) After(foo, self.after) foo(10) assert 0 == self.before_count assert 0 == self.after_count
def test_sender_as_parameter(self) -> None: self.zulu_calls = [] def zulu_one(*args): self.zulu_calls.append(args) def zulu_two(*args): self.zulu_calls.append(args) Before(self.a.foo, zulu_one, sender_as_parameter=True) assert self.zulu_calls == [] self.a.foo(0) assert self.zulu_calls == [(self.a, 0)] # The second method registered with the sender_as_parameter on did not receive it. Before(self.a.foo, zulu_two, sender_as_parameter=True) self.zulu_calls = [] self.a.foo(1) assert self.zulu_calls == [(self.a, 1), (self.a, 1)]
def test_sender_as_parameter_after_and_before(self) -> None: self.zulu_calls = [] def zulu_one(*args): self.zulu_calls.append((1, args)) def zulu_too(*args): self.zulu_calls.append((2, args)) Before(self.a.foo, zulu_one, sender_as_parameter=True) After(self.a.foo, zulu_too) assert self.zulu_calls == [] self.a.foo(0) assert self.zulu_calls == [(1, (self.a, 0)), (2, (0, ))]
def testReferenceDies(self) -> None: class Receiver: def before(dummy, *args): # @NoSelf self.before_count += 1 self.before_args = args rec = Receiver() self.before_count = 0 self.before_args = None foo = self.a.foo foo = Before(foo, rec.before) foo(10) assert self.before_args == (10, ) assert self.before_count == 1 del rec # kill the receiver foo(20) assert self.before_args == (10, ) assert self.before_count == 1
def testSenderDies(self) -> None: class Sender: def foo(s, *args): # @NoSelf s.args = args def __del__(dummy): # @NoSelf self.sender_died = True self.sender_died = False s = Sender() w = weakref.ref(s) Before(s.foo, self.before) s.foo(10) f = s.foo # hold a strong reference to s assert self.before_count == 1 assert self.before_called == (10, ) assert not self.sender_died del s assert self.sender_died with pytest.raises(ReferenceError): f(10) # must have already died: we don't have a strong reference assert w() is None
def __init__(self): Before(self.SetFilename, GetWeakProxy(self._BeforeSetFilename)) After(self.SetFilename, GetWeakProxy(self._AfterSetFilename)) self.before = False self.after = False