test_multiple_inheritance.py revision 12037
112037Sandreas.sandberg@arm.comimport pytest
211986Sandreas.sandberg@arm.com
311986Sandreas.sandberg@arm.com
411986Sandreas.sandberg@arm.comdef test_multiple_inheritance_cpp():
511986Sandreas.sandberg@arm.com    from pybind11_tests import MIType
611986Sandreas.sandberg@arm.com
711986Sandreas.sandberg@arm.com    mt = MIType(3, 4)
811986Sandreas.sandberg@arm.com
911986Sandreas.sandberg@arm.com    assert mt.foo() == 3
1011986Sandreas.sandberg@arm.com    assert mt.bar() == 4
1111986Sandreas.sandberg@arm.com
1211986Sandreas.sandberg@arm.com
1311986Sandreas.sandberg@arm.comdef test_multiple_inheritance_mix1():
1411986Sandreas.sandberg@arm.com    from pybind11_tests import Base2
1511986Sandreas.sandberg@arm.com
1611986Sandreas.sandberg@arm.com    class Base1:
1711986Sandreas.sandberg@arm.com        def __init__(self, i):
1811986Sandreas.sandberg@arm.com            self.i = i
1911986Sandreas.sandberg@arm.com
2011986Sandreas.sandberg@arm.com        def foo(self):
2111986Sandreas.sandberg@arm.com            return self.i
2211986Sandreas.sandberg@arm.com
2311986Sandreas.sandberg@arm.com    class MITypePy(Base1, Base2):
2411986Sandreas.sandberg@arm.com        def __init__(self, i, j):
2511986Sandreas.sandberg@arm.com            Base1.__init__(self, i)
2611986Sandreas.sandberg@arm.com            Base2.__init__(self, j)
2711986Sandreas.sandberg@arm.com
2811986Sandreas.sandberg@arm.com    mt = MITypePy(3, 4)
2911986Sandreas.sandberg@arm.com
3011986Sandreas.sandberg@arm.com    assert mt.foo() == 3
3111986Sandreas.sandberg@arm.com    assert mt.bar() == 4
3211986Sandreas.sandberg@arm.com
3311986Sandreas.sandberg@arm.com
3411986Sandreas.sandberg@arm.comdef test_multiple_inheritance_mix2():
3511986Sandreas.sandberg@arm.com    from pybind11_tests import Base1
3611986Sandreas.sandberg@arm.com
3711986Sandreas.sandberg@arm.com    class Base2:
3811986Sandreas.sandberg@arm.com        def __init__(self, i):
3911986Sandreas.sandberg@arm.com            self.i = i
4011986Sandreas.sandberg@arm.com
4111986Sandreas.sandberg@arm.com        def bar(self):
4211986Sandreas.sandberg@arm.com            return self.i
4311986Sandreas.sandberg@arm.com
4411986Sandreas.sandberg@arm.com    class MITypePy(Base1, Base2):
4511986Sandreas.sandberg@arm.com        def __init__(self, i, j):
4611986Sandreas.sandberg@arm.com            Base1.__init__(self, i)
4711986Sandreas.sandberg@arm.com            Base2.__init__(self, j)
4811986Sandreas.sandberg@arm.com
4911986Sandreas.sandberg@arm.com    mt = MITypePy(3, 4)
5011986Sandreas.sandberg@arm.com
5111986Sandreas.sandberg@arm.com    assert mt.foo() == 3
5211986Sandreas.sandberg@arm.com    assert mt.bar() == 4
5311986Sandreas.sandberg@arm.com
5411986Sandreas.sandberg@arm.com
5512037Sandreas.sandberg@arm.comdef test_multiple_inheritance_error():
5612037Sandreas.sandberg@arm.com    """Inheriting from multiple C++ bases in Python is not supported"""
5712037Sandreas.sandberg@arm.com    from pybind11_tests import Base1, Base2
5812037Sandreas.sandberg@arm.com
5912037Sandreas.sandberg@arm.com    with pytest.raises(TypeError) as excinfo:
6012037Sandreas.sandberg@arm.com        # noinspection PyUnusedLocal
6112037Sandreas.sandberg@arm.com        class MI(Base1, Base2):
6212037Sandreas.sandberg@arm.com            pass
6312037Sandreas.sandberg@arm.com    assert "Can't inherit from multiple C++ classes in Python" in str(excinfo.value)
6412037Sandreas.sandberg@arm.com
6512037Sandreas.sandberg@arm.com
6611986Sandreas.sandberg@arm.comdef test_multiple_inheritance_virtbase():
6711986Sandreas.sandberg@arm.com    from pybind11_tests import Base12a, bar_base2a, bar_base2a_sharedptr
6811986Sandreas.sandberg@arm.com
6911986Sandreas.sandberg@arm.com    class MITypePy(Base12a):
7011986Sandreas.sandberg@arm.com        def __init__(self, i, j):
7111986Sandreas.sandberg@arm.com            Base12a.__init__(self, i, j)
7211986Sandreas.sandberg@arm.com
7311986Sandreas.sandberg@arm.com    mt = MITypePy(3, 4)
7411986Sandreas.sandberg@arm.com    assert mt.bar() == 4
7511986Sandreas.sandberg@arm.com    assert bar_base2a(mt) == 4
7611986Sandreas.sandberg@arm.com    assert bar_base2a_sharedptr(mt) == 4
7712037Sandreas.sandberg@arm.com
7812037Sandreas.sandberg@arm.com
7912037Sandreas.sandberg@arm.comdef test_mi_static_properties():
8012037Sandreas.sandberg@arm.com    """Mixing bases with and without static properties should be possible
8112037Sandreas.sandberg@arm.com     and the result should be independent of base definition order"""
8212037Sandreas.sandberg@arm.com    from pybind11_tests import mi
8312037Sandreas.sandberg@arm.com
8412037Sandreas.sandberg@arm.com    for d in (mi.VanillaStaticMix1(), mi.VanillaStaticMix2()):
8512037Sandreas.sandberg@arm.com        assert d.vanilla() == "Vanilla"
8612037Sandreas.sandberg@arm.com        assert d.static_func1() == "WithStatic1"
8712037Sandreas.sandberg@arm.com        assert d.static_func2() == "WithStatic2"
8812037Sandreas.sandberg@arm.com        assert d.static_func() == d.__class__.__name__
8912037Sandreas.sandberg@arm.com
9012037Sandreas.sandberg@arm.com        mi.WithStatic1.static_value1 = 1
9112037Sandreas.sandberg@arm.com        mi.WithStatic2.static_value2 = 2
9212037Sandreas.sandberg@arm.com        assert d.static_value1 == 1
9312037Sandreas.sandberg@arm.com        assert d.static_value2 == 2
9412037Sandreas.sandberg@arm.com        assert d.static_value == 12
9512037Sandreas.sandberg@arm.com
9612037Sandreas.sandberg@arm.com        d.static_value1 = 0
9712037Sandreas.sandberg@arm.com        assert d.static_value1 == 0
9812037Sandreas.sandberg@arm.com        d.static_value2 = 0
9912037Sandreas.sandberg@arm.com        assert d.static_value2 == 0
10012037Sandreas.sandberg@arm.com        d.static_value = 0
10112037Sandreas.sandberg@arm.com        assert d.static_value == 0
10212037Sandreas.sandberg@arm.com
10312037Sandreas.sandberg@arm.com
10412037Sandreas.sandberg@arm.com@pytest.unsupported_on_pypy
10512037Sandreas.sandberg@arm.comdef test_mi_dynamic_attributes():
10612037Sandreas.sandberg@arm.com    """Mixing bases with and without dynamic attribute support"""
10712037Sandreas.sandberg@arm.com    from pybind11_tests import mi
10812037Sandreas.sandberg@arm.com
10912037Sandreas.sandberg@arm.com    for d in (mi.VanillaDictMix1(), mi.VanillaDictMix2()):
11012037Sandreas.sandberg@arm.com        d.dynamic = 1
11112037Sandreas.sandberg@arm.com        assert d.dynamic == 1
112