Skip to content

Commit 2f5ac26

Browse files
committed
Add tests demonstrating smart_holder issues with multiple inheritance
1 parent 152bb10 commit 2f5ac26

File tree

2 files changed

+194
-0
lines changed

2 files changed

+194
-0
lines changed

tests/test_multiple_inheritance.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,4 +230,84 @@ TEST_SUBMODULE(multiple_inheritance, m) {
230230
.def("c1", [](C1 *self) { return self; });
231231
py::class_<D, C0, C1>(m, "D")
232232
.def(py::init<>());
233+
234+
// test_another_diamond_*
235+
// - functions are get_{base}_{var}, return {var}
236+
struct MVB {
237+
int b = 1;
238+
virtual ~MVB() = default;
239+
int get_b_b() { return b; }
240+
};
241+
struct MVC : virtual MVB {
242+
int c = 2;
243+
int get_c_b() { return b; }
244+
int get_c_c() { return c; }
245+
};
246+
struct MVD0 : virtual MVC {
247+
int d0 = 3;
248+
int get_d0_b() { return b; }
249+
int get_d0_c() { return c; }
250+
int get_d0_d0() { return d0; }
251+
};
252+
struct MVD1 : virtual MVC {
253+
int d1 = 4;
254+
int get_d1_b() { return b; }
255+
int get_d1_c() { return c; }
256+
int get_d1_d1() { return d1; }
257+
};
258+
struct MVE : virtual MVD0, virtual MVD1 {
259+
int e = 5;
260+
int get_e_b() { return b; }
261+
int get_e_c() { return c; }
262+
int get_e_d0() { return d0; }
263+
int get_e_d1() { return d1; }
264+
int get_e_e() { return e; }
265+
};
266+
struct MVF : virtual MVE {
267+
int f = 6;
268+
int get_f_b() { return b; }
269+
int get_f_c() { return c; }
270+
int get_f_d0() { return d0; }
271+
int get_f_d1() { return d1; }
272+
int get_f_e() { return e; }
273+
int get_f_f() { return f; }
274+
};
275+
py::class_<MVB>(m, "MVB", py::multiple_inheritance())
276+
.def(py::init<>())
277+
.def("get_b_b", &MVB::get_b_b)
278+
.def_readwrite("b", &MVB::b);
279+
py::class_<MVC, MVB>(m, "MVC", py::multiple_inheritance())
280+
.def(py::init<>())
281+
.def("get_c_b", &MVC::get_c_b)
282+
.def("get_c_c", &MVC::get_c_c)
283+
.def_readwrite("c", &MVC::c);
284+
py::class_<MVD0, MVC>(m, "MVD0", py::multiple_inheritance())
285+
.def(py::init<>())
286+
.def("get_d0_b", &MVD0::get_d0_b)
287+
.def("get_d0_c", &MVD0::get_d0_c)
288+
.def("get_d0_d0", &MVD0::get_d0_d0)
289+
.def_readwrite("d0", &MVD0::d0);
290+
py::class_<MVD1, MVC>(m, "MVD1", py::multiple_inheritance())
291+
.def(py::init<>())
292+
.def("get_d1_b", &MVD1::get_d1_b)
293+
.def("get_d1_c", &MVD1::get_d1_c)
294+
.def("get_d1_d1", &MVD1::get_d1_d1)
295+
.def_readwrite("d1", &MVD1::d1);
296+
py::class_<MVE, MVD0, MVD1>(m, "MVE", py::multiple_inheritance())
297+
.def(py::init<>())
298+
.def("get_e_b", &MVE::get_e_b)
299+
.def("get_e_c", &MVE::get_e_c)
300+
.def("get_e_d0", &MVE::get_e_d0)
301+
.def("get_e_d1", &MVE::get_e_d1)
302+
.def("get_e_e", &MVE::get_e_e)
303+
.def_readwrite("e", &MVE::e);
304+
py::class_<MVF, MVE>(m, "MVF", py::multiple_inheritance())
305+
.def(py::init<>())
306+
.def("get_f_b", &MVF::get_f_b)
307+
.def("get_f_c", &MVF::get_f_c)
308+
.def("get_f_d0", &MVF::get_f_d0)
309+
.def("get_f_d1", &MVF::get_f_d1)
310+
.def("get_f_e", &MVF::get_f_e)
311+
.def("get_f_f", &MVF::get_f_f)
312+
.def_readwrite("f", &MVF::f);
233313
}

tests/test_multiple_inheritance.py

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,3 +358,117 @@ def test_diamond_inheritance():
358358
assert d is d.c0().b()
359359
assert d is d.c1().b()
360360
assert d is d.c0().c1().b().c0().b()
361+
362+
363+
def test_another_diamond_b():
364+
o = m.MVB()
365+
assert o.b == 1
366+
367+
assert o.get_b_b() == 1
368+
369+
370+
def test_another_diamond_c():
371+
o = m.MVC()
372+
assert o.b == 1
373+
assert o.c == 2
374+
375+
assert o.get_b_b() == 1
376+
assert o.get_c_b() == 1
377+
378+
assert o.get_c_c() == 2
379+
380+
381+
def test_another_diamond_d0():
382+
o = m.MVD0()
383+
assert o.b == 1
384+
assert o.c == 2
385+
assert o.d0 == 3
386+
387+
assert o.get_b_b() == 1
388+
assert o.get_c_b() == 1
389+
assert o.get_d0_b() == 1
390+
391+
assert o.get_c_c() == 2
392+
assert o.get_d0_c() == 2
393+
394+
assert o.get_d0_d0() == 3
395+
396+
397+
def test_another_diamond_d1():
398+
o = m.MVD1()
399+
assert o.b == 1
400+
assert o.c == 2
401+
assert o.d1 == 4
402+
403+
assert o.get_b_b() == 1
404+
assert o.get_c_b() == 1
405+
assert o.get_d1_b() == 1
406+
407+
assert o.get_c_c() == 2
408+
assert o.get_d1_c() == 2
409+
410+
assert o.get_d1_d1() == 4
411+
412+
413+
def test_another_diamond_e():
414+
o = m.MVE()
415+
assert o.b == 1
416+
assert o.c == 2
417+
assert o.d0 == 3
418+
assert o.d1 == 4
419+
assert o.e == 5
420+
421+
assert o.get_b_b() == 1
422+
assert o.get_c_b() == 1
423+
assert o.get_d0_b() == 1
424+
assert o.get_d1_b() == 1
425+
assert o.get_e_b() == 1
426+
427+
assert o.get_c_c() == 2
428+
assert o.get_d0_c() == 2
429+
assert o.get_d1_c() == 2
430+
assert o.get_e_c() == 2
431+
432+
assert o.get_d0_d0() == 3
433+
assert o.get_e_d0() == 3
434+
435+
assert o.get_d1_d1() == 4
436+
assert o.get_e_d1() == 4
437+
438+
assert o.get_e_e() == 5
439+
440+
441+
def test_another_diamond_f():
442+
o = m.MVF()
443+
assert o.b == 1
444+
assert o.c == 2
445+
assert o.d0 == 3
446+
assert o.d1 == 4
447+
assert o.e == 5
448+
assert o.f == 6
449+
450+
assert o.get_b_b() == 1
451+
assert o.get_c_b() == 1
452+
assert o.get_d0_b() == 1
453+
assert o.get_d1_b() == 1
454+
assert o.get_e_b() == 1
455+
assert o.get_f_b() == 1
456+
457+
assert o.get_c_c() == 2
458+
assert o.get_d0_c() == 2
459+
assert o.get_d1_c() == 2
460+
assert o.get_e_c() == 2
461+
assert o.get_f_c() == 2
462+
463+
assert o.get_d0_d0() == 3
464+
assert o.get_e_d0() == 3
465+
assert o.get_f_d0() == 3
466+
467+
assert o.get_d1_d1() == 4
468+
assert o.get_e_d1() == 4
469+
assert o.get_f_d1() == 4
470+
471+
assert o.get_e_e() == 5
472+
assert o.get_f_e() == 5
473+
474+
assert o.get_f_f() == 6

0 commit comments

Comments
 (0)