blob: 7aaab7cd0d8326e68a9b9369c3dec945143f0453 [file] [log] [blame]
Dean Moldovan08cbe8d2017-02-15 21:10:25 +01001import pytest
2
3
Dean Moldovanbad17402016-11-20 21:21:54 +01004def test_multiple_inheritance_cpp():
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09005 from pybind11_tests import MIType
6
7 mt = MIType(3, 4)
8
9 assert mt.foo() == 3
10 assert mt.bar() == 4
11
12
Dean Moldovanbad17402016-11-20 21:21:54 +010013def test_multiple_inheritance_mix1():
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +090014 from pybind11_tests import Base2
15
16 class Base1:
17 def __init__(self, i):
18 self.i = i
19
20 def foo(self):
21 return self.i
22
23 class MITypePy(Base1, Base2):
24 def __init__(self, i, j):
25 Base1.__init__(self, i)
26 Base2.__init__(self, j)
27
28 mt = MITypePy(3, 4)
29
30 assert mt.foo() == 3
31 assert mt.bar() == 4
32
33
Dean Moldovanbad17402016-11-20 21:21:54 +010034def test_multiple_inheritance_mix2():
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +090035 from pybind11_tests import Base1
36
37 class Base2:
38 def __init__(self, i):
39 self.i = i
40
41 def bar(self):
42 return self.i
43
44 class MITypePy(Base1, Base2):
45 def __init__(self, i, j):
46 Base1.__init__(self, i)
47 Base2.__init__(self, j)
48
49 mt = MITypePy(3, 4)
50
51 assert mt.foo() == 3
52 assert mt.bar() == 4
53
54
Dean Moldovan08cbe8d2017-02-15 21:10:25 +010055def test_multiple_inheritance_error():
56 """Inheriting from multiple C++ bases in Python is not supported"""
57 from pybind11_tests import Base1, Base2
58
59 with pytest.raises(TypeError) as excinfo:
60 # noinspection PyUnusedLocal
61 class MI(Base1, Base2):
62 pass
63 assert "Can't inherit from multiple C++ classes in Python" in str(excinfo.value)
64
65
Dean Moldovanbad17402016-11-20 21:21:54 +010066def test_multiple_inheritance_virtbase():
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +090067 from pybind11_tests import Base12a, bar_base2a, bar_base2a_sharedptr
68
69 class MITypePy(Base12a):
70 def __init__(self, i, j):
71 Base12a.__init__(self, i, j)
72
73 mt = MITypePy(3, 4)
74 assert mt.bar() == 4
75 assert bar_base2a(mt) == 4
76 assert bar_base2a_sharedptr(mt) == 4
Dean Moldovan08cbe8d2017-02-15 21:10:25 +010077
78
79def test_mi_static_properties():
80 """Mixing bases with and without static properties should be possible
81 and the result should be independent of base definition order"""
82 from pybind11_tests import mi
83
84 for d in (mi.VanillaStaticMix1(), mi.VanillaStaticMix2()):
85 assert d.vanilla() == "Vanilla"
86 assert d.static_func1() == "WithStatic1"
87 assert d.static_func2() == "WithStatic2"
88 assert d.static_func() == d.__class__.__name__
89
90 mi.WithStatic1.static_value1 = 1
91 mi.WithStatic2.static_value2 = 2
92 assert d.static_value1 == 1
93 assert d.static_value2 == 2
94 assert d.static_value == 12
95
96 d.static_value1 = 0
97 assert d.static_value1 == 0
98 d.static_value2 = 0
99 assert d.static_value2 == 0
100 d.static_value = 0
101 assert d.static_value == 0
102
103
104@pytest.unsupported_on_pypy
105def test_mi_dynamic_attributes():
106 """Mixing bases with and without dynamic attribute support"""
107 from pybind11_tests import mi
108
109 for d in (mi.VanillaDictMix1(), mi.VanillaDictMix2()):
110 d.dynamic = 1
111 assert d.dynamic == 1