1
1
# -*- coding: utf-8 -*-
2
+ import pytest
3
+
4
+ import env # noqa: F401
2
5
3
6
from pybind11_tests import class_sh_disowning_mi as m
4
7
@@ -15,9 +18,9 @@ def test_diamond_inheritance():
15
18
assert d is d .c0 ().c1 ().b ().c0 ().b ()
16
19
17
20
18
- def was_disowned (obj ):
21
+ def was_disowned (callable_method ):
19
22
try :
20
- obj . get ()
23
+ callable_method ()
21
24
except ValueError as e :
22
25
assert (
23
26
str (e )
@@ -30,36 +33,221 @@ def was_disowned(obj):
30
33
def test_disown_b ():
31
34
b = m .B ()
32
35
assert b .get () == 10
33
- m .disown (b )
34
- assert was_disowned (b )
36
+ m .disown_b (b )
37
+ assert was_disowned (b . get )
35
38
36
39
37
- def test_disown_c0 ():
40
+ @pytest .mark .parametrize ("var_to_disown" , ["c0" , "b" ])
41
+ def test_disown_c0 (var_to_disown ):
38
42
c0 = m .C0 ()
39
43
assert c0 .get () == 1020
40
44
b = c0 .b ()
41
- m .disown ( c0 )
42
- assert was_disowned (c0 )
43
- assert was_disowned (b )
45
+ m .disown_b ( locals ()[ var_to_disown ] )
46
+ assert was_disowned (c0 . get )
47
+ assert was_disowned (b . get )
44
48
45
49
46
- def test_disown_c1 ():
50
+ @pytest .mark .parametrize ("var_to_disown" , ["c1" , "b" ])
51
+ def test_disown_c1 (var_to_disown ):
47
52
c1 = m .C1 ()
48
53
assert c1 .get () == 1021
49
54
b = c1 .b ()
50
- m .disown ( c1 )
51
- assert was_disowned (c1 )
52
- assert was_disowned (b )
55
+ m .disown_b ( locals ()[ var_to_disown ] )
56
+ assert was_disowned (c1 . get )
57
+ assert was_disowned (b . get )
53
58
54
59
55
- def test_disown_d ():
60
+ @pytest .mark .parametrize ("var_to_disown" , ["d" , "c1" , "c0" , "b" ])
61
+ def test_disown_d (var_to_disown ):
56
62
d = m .D ()
57
63
assert d .get () == 10202130
58
64
b = d .b ()
59
65
c0 = d .c0 ()
60
66
c1 = d .c1 ()
61
- m .disown (d )
62
- assert was_disowned (d )
63
- assert was_disowned (c1 )
64
- assert was_disowned (c0 )
65
- assert was_disowned (b )
67
+ m .disown_b (locals ()[var_to_disown ])
68
+ assert was_disowned (d .get )
69
+ assert was_disowned (c1 .get )
70
+ assert was_disowned (c0 .get )
71
+ assert was_disowned (b .get )
72
+
73
+
74
+ # Based on test_multiple_inheritance.py:test_multiple_inheritance_python.
75
+ class MI1 (m .Base1 , m .Base2 ):
76
+ def __init__ (self , i , j ):
77
+ m .Base1 .__init__ (self , i )
78
+ m .Base2 .__init__ (self , j )
79
+
80
+
81
+ class B1 (object ):
82
+ def v (self ):
83
+ return 1
84
+
85
+
86
+ class MI2 (B1 , m .Base1 , m .Base2 ):
87
+ def __init__ (self , i , j ):
88
+ B1 .__init__ (self )
89
+ m .Base1 .__init__ (self , i )
90
+ m .Base2 .__init__ (self , j )
91
+
92
+
93
+ class MI3 (MI2 ):
94
+ def __init__ (self , i , j ):
95
+ MI2 .__init__ (self , i , j )
96
+
97
+
98
+ class MI4 (MI3 , m .Base2 ):
99
+ def __init__ (self , i , j ):
100
+ MI3 .__init__ (self , i , j )
101
+ # This should be ignored (Base2 is already initialized via MI2):
102
+ m .Base2 .__init__ (self , i + 100 )
103
+
104
+
105
+ class MI5 (m .Base2 , B1 , m .Base1 ):
106
+ def __init__ (self , i , j ):
107
+ B1 .__init__ (self )
108
+ m .Base1 .__init__ (self , i )
109
+ m .Base2 .__init__ (self , j )
110
+
111
+
112
+ class MI6 (m .Base2 , B1 ):
113
+ def __init__ (self , i ):
114
+ m .Base2 .__init__ (self , i )
115
+ B1 .__init__ (self )
116
+
117
+
118
+ class B2 (B1 ):
119
+ def v (self ):
120
+ return 2
121
+
122
+
123
+ class B3 (object ):
124
+ def v (self ):
125
+ return 3
126
+
127
+
128
+ class B4 (B3 , B2 ):
129
+ def v (self ):
130
+ return 4
131
+
132
+
133
+ class MI7 (B4 , MI6 ):
134
+ def __init__ (self , i ):
135
+ B4 .__init__ (self )
136
+ MI6 .__init__ (self , i )
137
+
138
+
139
+ class MI8 (MI6 , B3 ):
140
+ def __init__ (self , i ):
141
+ MI6 .__init__ (self , i )
142
+ B3 .__init__ (self )
143
+
144
+
145
+ class MI8b (B3 , MI6 ):
146
+ def __init__ (self , i ):
147
+ B3 .__init__ (self )
148
+ MI6 .__init__ (self , i )
149
+
150
+
151
+ @pytest .mark .skipif ("env.PYPY and env.PY2" )
152
+ @pytest .mark .xfail ("env.PYPY and not env.PY2" )
153
+ def test_multiple_inheritance_python ():
154
+ # Based on test_multiple_inheritance.py:test_multiple_inheritance_python.
155
+ # Exercises values_and_holders with 2 value_and_holder instances.
156
+
157
+ mi1 = MI1 (1 , 2 )
158
+ assert mi1 .foo () == 1
159
+ assert mi1 .bar () == 2
160
+
161
+ mi2 = MI2 (3 , 4 )
162
+ assert mi2 .v () == 1
163
+ assert mi2 .foo () == 3
164
+ assert mi2 .bar () == 4
165
+
166
+ mi3 = MI3 (5 , 6 )
167
+ assert mi3 .v () == 1
168
+ assert mi3 .foo () == 5
169
+ assert mi3 .bar () == 6
170
+
171
+ mi4 = MI4 (7 , 8 )
172
+ assert mi4 .v () == 1
173
+ assert mi4 .foo () == 7
174
+ assert mi4 .bar () == 8
175
+
176
+ mi5 = MI5 (10 , 11 )
177
+ assert mi5 .v () == 1
178
+ assert mi5 .foo () == 10
179
+ assert mi5 .bar () == 11
180
+
181
+ mi6 = MI6 (12 )
182
+ assert mi6 .v () == 1
183
+ assert mi6 .bar () == 12
184
+
185
+ mi7 = MI7 (13 )
186
+ assert mi7 .v () == 4
187
+ assert mi7 .bar () == 13
188
+
189
+ mi8 = MI8 (14 )
190
+ assert mi8 .v () == 1
191
+ assert mi8 .bar () == 14
192
+
193
+ mi8b = MI8b (15 )
194
+ assert mi8b .v () == 3
195
+ assert mi8b .bar () == 15
196
+
197
+
198
+ DISOWN_CLS_I_J_V_LIST = [
199
+ (MI1 , 1 , 2 , None ),
200
+ (MI2 , 3 , 4 , 1 ),
201
+ (MI3 , 5 , 6 , 1 ),
202
+ (MI4 , 7 , 8 , 1 ),
203
+ (MI5 , 10 , 11 , 1 ),
204
+ ]
205
+
206
+
207
+ @pytest .mark .skipif ("env.PYPY and env.PY2" )
208
+ @pytest .mark .xfail ("env.PYPY and not env.PY2" , strict = False )
209
+ @pytest .mark .parametrize ("cls, i, j, v" , DISOWN_CLS_I_J_V_LIST )
210
+ def test_disown_base1_first (cls , i , j , v ):
211
+ obj = cls (i , j )
212
+ assert obj .foo () == i
213
+ assert m .disown_base1 (obj ) == 2000 * i + 1
214
+ assert was_disowned (obj .foo )
215
+ assert obj .bar () == j
216
+ assert m .disown_base2 (obj ) == 2000 * j + 2
217
+ assert was_disowned (obj .bar )
218
+ if v is not None :
219
+ assert obj .v () == v
220
+
221
+
222
+ @pytest .mark .skipif ("env.PYPY and env.PY2" )
223
+ @pytest .mark .xfail ("env.PYPY and not env.PY2" , strict = False )
224
+ @pytest .mark .parametrize ("cls, i, j, v" , DISOWN_CLS_I_J_V_LIST )
225
+ def test_disown_base2_first (cls , i , j , v ):
226
+ obj = cls (i , j )
227
+ assert obj .bar () == j
228
+ assert m .disown_base2 (obj ) == 2000 * j + 2
229
+ assert was_disowned (obj .bar )
230
+ assert obj .foo () == i
231
+ assert m .disown_base1 (obj ) == 2000 * i + 1
232
+ assert was_disowned (obj .foo )
233
+ if v is not None :
234
+ assert obj .v () == v
235
+
236
+
237
+ @pytest .mark .skipif ("env.PYPY and env.PY2" )
238
+ @pytest .mark .xfail ("env.PYPY and not env.PY2" , strict = False )
239
+ @pytest .mark .parametrize (
240
+ "cls, j, v" ,
241
+ [
242
+ (MI6 , 12 , 1 ),
243
+ (MI7 , 13 , 4 ),
244
+ (MI8 , 14 , 1 ),
245
+ (MI8b , 15 , 3 ),
246
+ ],
247
+ )
248
+ def test_disown_base2 (cls , j , v ):
249
+ obj = cls (j )
250
+ assert obj .bar () == j
251
+ assert m .disown_base2 (obj ) == 2000 * j + 2
252
+ assert was_disowned (obj .bar )
253
+ assert obj .v () == v
0 commit comments