Skip to content

Commit 3c287cf

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

File tree

2 files changed

+197
-0
lines changed

2 files changed

+197
-0
lines changed

Diff for: tests/test_multiple_inheritance.cpp

+83
Original file line numberDiff line numberDiff line change
@@ -230,4 +230,87 @@ 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+
MVB() = default;
238+
MVB(const MVB&) = default;
239+
virtual ~MVB() = default;
240+
241+
int b = 1;
242+
int get_b_b() { return b; }
243+
};
244+
struct MVC : virtual MVB {
245+
int c = 2;
246+
int get_c_b() { return b; }
247+
int get_c_c() { return c; }
248+
};
249+
struct MVD0 : virtual MVC {
250+
int d0 = 3;
251+
int get_d0_b() { return b; }
252+
int get_d0_c() { return c; }
253+
int get_d0_d0() { return d0; }
254+
};
255+
struct MVD1 : virtual MVC {
256+
int d1 = 4;
257+
int get_d1_b() { return b; }
258+
int get_d1_c() { return c; }
259+
int get_d1_d1() { return d1; }
260+
};
261+
struct MVE : virtual MVD0, virtual MVD1 {
262+
int e = 5;
263+
int get_e_b() { return b; }
264+
int get_e_c() { return c; }
265+
int get_e_d0() { return d0; }
266+
int get_e_d1() { return d1; }
267+
int get_e_e() { return e; }
268+
};
269+
struct MVF : virtual MVE {
270+
int f = 6;
271+
int get_f_b() { return b; }
272+
int get_f_c() { return c; }
273+
int get_f_d0() { return d0; }
274+
int get_f_d1() { return d1; }
275+
int get_f_e() { return e; }
276+
int get_f_f() { return f; }
277+
};
278+
py::class_<MVB>(m, "MVB", py::multiple_inheritance())
279+
.def(py::init<>())
280+
.def("get_b_b", &MVB::get_b_b)
281+
.def_readwrite("b", &MVB::b);
282+
py::class_<MVC, MVB>(m, "MVC", py::multiple_inheritance())
283+
.def(py::init<>())
284+
.def("get_c_b", &MVC::get_c_b)
285+
.def("get_c_c", &MVC::get_c_c)
286+
.def_readwrite("c", &MVC::c);
287+
py::class_<MVD0, MVC>(m, "MVD0", py::multiple_inheritance())
288+
.def(py::init<>())
289+
.def("get_d0_b", &MVD0::get_d0_b)
290+
.def("get_d0_c", &MVD0::get_d0_c)
291+
.def("get_d0_d0", &MVD0::get_d0_d0)
292+
.def_readwrite("d0", &MVD0::d0);
293+
py::class_<MVD1, MVC>(m, "MVD1", py::multiple_inheritance())
294+
.def(py::init<>())
295+
.def("get_d1_b", &MVD1::get_d1_b)
296+
.def("get_d1_c", &MVD1::get_d1_c)
297+
.def("get_d1_d1", &MVD1::get_d1_d1)
298+
.def_readwrite("d1", &MVD1::d1);
299+
py::class_<MVE, MVD0, MVD1>(m, "MVE", py::multiple_inheritance())
300+
.def(py::init<>())
301+
.def("get_e_b", &MVE::get_e_b)
302+
.def("get_e_c", &MVE::get_e_c)
303+
.def("get_e_d0", &MVE::get_e_d0)
304+
.def("get_e_d1", &MVE::get_e_d1)
305+
.def("get_e_e", &MVE::get_e_e)
306+
.def_readwrite("e", &MVE::e);
307+
py::class_<MVF, MVE>(m, "MVF", py::multiple_inheritance())
308+
.def(py::init<>())
309+
.def("get_f_b", &MVF::get_f_b)
310+
.def("get_f_c", &MVF::get_f_c)
311+
.def("get_f_d0", &MVF::get_f_d0)
312+
.def("get_f_d1", &MVF::get_f_d1)
313+
.def("get_f_e", &MVF::get_f_e)
314+
.def("get_f_f", &MVF::get_f_f)
315+
.def_readwrite("f", &MVF::f);
233316
}

Diff for: tests/test_multiple_inheritance.py

+114
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)