def test_inherit_a_hook_method(self):
        class Base(object):
            value1 = 0
            value2 = 0

            @hook()
            def func1(self):
                self.value1 = 1

            @hook()
            def func2(self):
                self.value2 = 2

        class Derive(Base):
            value3 = 0

            @hook()
            def func3(self):
                self.value3 = 3

            func2 = hook()(Base.func2)

        obj = Derive()
        Hooks.exec_hooks(obj)
        self.assertEqual(0, obj.value1)  # value1 was inherited, but not hooked
        self.assertEqual(2, obj.value2)
        self.assertEqual(3, obj.value3)
    def test_hooks_can_inherit(self):
        class Base(object):
            value1 = 0

            @hook()
            def func1(self):
                self.value1 = 1

        class Derive(Base):
            hooks = Base.hooks.copy()
            value2 = 0

            @hook()
            def func2(self):
                self.value2 = 2

        obj = Derive()
        Hooks.exec_hooks(obj)
        self.assertEqual(1, obj.value1)
        self.assertEqual(2, obj.value2)

        obj = Base()
        Hooks.exec_hooks(obj)
        self.assertEqual(1, obj.value1)
        self.assert_(not hasattr(obj, 'value2'))
    def test_inherit_hooks_must_not_pollution(self):
        class Base(object):
            value1 = 0

            @hook()
            def func1(self):
                self.value1 = 1

        class DeriveA(Base):
            hooks = Base.hooks.copy()
            value2 = 0

            @hook()
            def func2(self):
                self.value2 = 2

        class DeriveB(Base):
            value3 = 0

            @hook()
            def func3(self):
                self.value3 = 3

        obj = DeriveB()
        Hooks.exec_hooks(obj)
        self.assertEqual(0, obj.value1)  # value1 was inherited, but not hooked
        self.assertEqual(3, obj.value3)
        self.assert_(not hasattr(obj, 'value2'))
    def test_call_func(self):
        class Base(object):
            value = 0

            @hook()
            def func1(self):
                self.value = 1

        obj = Base()
        Hooks.exec_hooks(obj)
        self.assertEqual(1, obj.value)
    def test_hooks_does_not_inherit(self):
        class Base(object):
            value1 = 0

            @hook()
            def func1(self):
                self.value1 = 1

        class Derive(Base):
            value2 = 0

            @hook()
            def func2(self):
                self.value2 = 2

        obj = Derive()
        Hooks.exec_hooks(obj)
        self.assertEqual(0, obj.value1)  # value1 was inherited, but not hooked
        self.assertEqual(2, obj.value2)
    def test_register_named_hooks(self):
        class Base(object):
            value1 = 0
            value2 = 0
            value3 = 0

            @hook()
            def func1(self):
                self.value1 = 1

            @hook('foo')
            def func2(self):
                self.value2 = 2

            @hook('bar')
            def func3(self):
                self.value3 = 3

        obj = Base()
        Hooks.exec_hooks(obj)
        self.assertEqual(1, obj.value1)
        self.assertEqual(2, obj.value2)
        self.assertEqual(3, obj.value3)

        obj = Base()
        Hooks.exec_hooks(obj, 'foo')
        self.assertEqual(0, obj.value1)
        self.assertEqual(2, obj.value2)
        self.assertEqual(0, obj.value3)

        obj = Base()
        Hooks.exec_hooks(obj, 'bar')
        self.assertEqual(0, obj.value1)
        self.assertEqual(0, obj.value2)
        self.assertEqual(3, obj.value3)

        obj = Base()
        Hooks.exec_hooks(obj, 'baz')
        self.assertEqual(0, obj.value1)
        self.assertEqual(0, obj.value2)
        self.assertEqual(0, obj.value3)
    def test_inherit_and_retiming_hook_method(self):
        class Base(object):
            value1 = 0
            value2 = 0

            @hook('foo')
            def func1(self):
                self.value1 = 1

            @hook('foo')
            def func2(self):
                self.value2 = 2

        class Derive(Base):
            value3 = 0

            @hook('bar')
            def func3(self):
                self.value3 = 3

            func2 = hook('bar')(Base.func2)

        obj = Base()
        Hooks.exec_hooks(obj, 'foo')
        self.assertEqual(1, obj.value1)
        self.assertEqual(2, obj.value2)
        self.assert_(not hasattr(obj, 'value3'))

        obj = Derive()
        Hooks.exec_hooks(obj, 'foo')
        self.assertEqual(0, obj.value1)
        self.assertEqual(0, obj.value2)
        self.assertEqual(0, obj.value3)

        obj = Derive()
        Hooks.exec_hooks(obj, 'bar')
        self.assertEqual(0, obj.value1)
        self.assertEqual(2, obj.value2)
        self.assertEqual(3, obj.value3)