예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
    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
예제 #4
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
예제 #5
0
    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
예제 #6
0
    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)]
예제 #7
0
    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, ))]
예제 #8
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
예제 #9
0
    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
예제 #10
0
 def __init__(self):
     Before(self.SetFilename, GetWeakProxy(self._BeforeSetFilename))
     After(self.SetFilename, GetWeakProxy(self._AfterSetFilename))
     self.before = False
     self.after = False