def test_single_down(self):
        class A(object):
            pass

        attributes.register_class(A)

        mgr_factory = lambda cls: attributes.ClassManager(cls)

        class B(A):
            __sa_instrumentation_manager__ = staticmethod(mgr_factory)

        assert_raises(TypeError, attributes.register_class, B)
    def test_diamond_b2(self):
        mgr_factory = lambda cls: attributes.ClassManager(cls)

        class A(object):
            pass

        class B1(A):
            pass

        class B2(A):
            __sa_instrumentation_manager__ = mgr_factory

        class C(object):
            pass

        assert_raises(TypeError, attributes.register_class, B2)
    def test_single_up(self):
        class A(object):
            pass

        # delay registration

        mgr_factory = lambda cls: attributes.ClassManager(cls)

        class B(A):
            __sa_instrumentation_manager__ = staticmethod(mgr_factory)

        attributes.register_class(B)

        assert_raises_message(TypeError,
                              "multiple instrumentation implementations",
                              attributes.register_class, A)
    def test_none(self):
        class A(object):
            pass

        attributes.register_class(A)

        mgr_factory = lambda cls: attributes.ClassManager(cls)

        class B(object):
            __sa_instrumentation_manager__ = staticmethod(mgr_factory)

        attributes.register_class(B)

        class C(object):
            __sa_instrumentation_manager__ = attributes.ClassManager

        attributes.register_class(C)
    def test_diamond_b1(self):
        mgr_factory = lambda cls: attributes.ClassManager(cls)

        class A(object):
            pass

        class B1(A):
            pass

        class B2(A):
            __sa_instrumentation_manager__ = staticmethod(mgr_factory)

        class C(object):
            pass

        assert_raises_message(TypeError,
                              "multiple instrumentation implementations",
                              attributes.register_class, B1)