Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gaoqiong
pybind11
Commits
44a17e1f
Commit
44a17e1f
authored
Jul 25, 2017
by
Jason Rhinelander
Browse files
Convert test_multiple_inheritance to new style
Significant rearrangement, but no new tests added.
parent
79372601
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
152 additions
and
176 deletions
+152
-176
tests/test_multiple_inheritance.cpp
tests/test_multiple_inheritance.cpp
+82
-93
tests/test_multiple_inheritance.py
tests/test_multiple_inheritance.py
+70
-83
No files found.
tests/test_multiple_inheritance.cpp
View file @
44a17e1f
...
...
@@ -11,47 +11,74 @@
#include "pybind11_tests.h"
#include "constructor_stats.h"
struct
Base1
{
Base1
(
int
i
)
:
i
(
i
)
{
}
int
foo
()
{
return
i
;
}
int
i
;
};
struct
Base2
{
Base2
(
int
i
)
:
i
(
i
)
{
}
int
bar
()
{
return
i
;
}
int
i
;
};
// Many bases for testing that multiple inheritance from many classes (i.e. requiring extra
// space for holder constructed flags) works.
template
<
int
N
>
struct
BaseN
{
BaseN
(
int
i
)
:
i
(
i
)
{
}
int
i
;
};
struct
Base12
:
Base1
,
Base2
{
Base12
(
int
i
,
int
j
)
:
Base1
(
i
),
Base2
(
j
)
{
}
// test_mi_static_properties
struct
Vanilla
{
std
::
string
vanilla
()
{
return
"Vanilla"
;
};
};
struct
MIType
:
Base12
{
MIType
(
int
i
,
int
j
)
:
Base12
(
i
,
j
)
{
}
struct
WithStatic1
{
static
std
::
string
static_func1
()
{
return
"WithStatic1"
;
};
static
int
static_value1
;
};
struct
WithStatic2
{
static
std
::
string
static_func2
()
{
return
"WithStatic2"
;
};
static
int
static_value2
;
};
struct
VanillaStaticMix1
:
Vanilla
,
WithStatic1
,
WithStatic2
{
static
std
::
string
static_func
()
{
return
"VanillaStaticMix1"
;
}
static
int
static_value
;
};
struct
VanillaStaticMix2
:
WithStatic1
,
Vanilla
,
WithStatic2
{
static
std
::
string
static_func
()
{
return
"VanillaStaticMix2"
;
}
static
int
static_value
;
};
int
WithStatic1
::
static_value1
=
1
;
int
WithStatic2
::
static_value2
=
2
;
int
VanillaStaticMix1
::
static_value
=
12
;
int
VanillaStaticMix2
::
static_value
=
12
;
TEST_SUBMODULE
(
multiple_inheritance
,
m
)
{
test_initializer
multiple_inheritance
([](
py
::
module
&
m
)
{
// test_multiple_inheritance_mix1
// test_multiple_inheritance_mix2
struct
Base1
{
Base1
(
int
i
)
:
i
(
i
)
{
}
int
foo
()
{
return
i
;
}
int
i
;
};
py
::
class_
<
Base1
>
b1
(
m
,
"Base1"
);
b1
.
def
(
py
::
init
<
int
>
())
.
def
(
"foo"
,
&
Base1
::
foo
);
struct
Base2
{
Base2
(
int
i
)
:
i
(
i
)
{
}
int
bar
()
{
return
i
;
}
int
i
;
};
py
::
class_
<
Base2
>
b2
(
m
,
"Base2"
);
b2
.
def
(
py
::
init
<
int
>
())
.
def
(
"bar"
,
&
Base2
::
bar
);
py
::
class_
<
Base12
,
Base1
,
Base2
>
(
m
,
"Base12"
);
// test_multiple_inheritance_cpp
struct
Base12
:
Base1
,
Base2
{
Base12
(
int
i
,
int
j
)
:
Base1
(
i
),
Base2
(
j
)
{
}
};
struct
MIType
:
Base12
{
MIType
(
int
i
,
int
j
)
:
Base12
(
i
,
j
)
{
}
};
py
::
class_
<
Base12
,
Base1
,
Base2
>
(
m
,
"Base12"
);
py
::
class_
<
MIType
,
Base12
>
(
m
,
"MIType"
)
.
def
(
py
::
init
<
int
,
int
>
());
// Many bases for testing that multiple inheritance from many classes (i.e. requiring extra
//
space for holder constructed flags) works.
//
test_multiple_inheritance_python_many_bases
#define PYBIND11_BASEN(N) py::class_<BaseN<N>>(m, "BaseN" #N).def(py::init<int>()).def("f" #N, [](BaseN<N> &b) { return b.i + N; })
PYBIND11_BASEN
(
1
);
PYBIND11_BASEN
(
2
);
PYBIND11_BASEN
(
3
);
PYBIND11_BASEN
(
4
);
PYBIND11_BASEN
(
5
);
PYBIND11_BASEN
(
6
);
PYBIND11_BASEN
(
7
);
PYBIND11_BASEN
(
8
);
...
...
@@ -67,55 +94,50 @@ test_initializer multiple_inheritance([](py::module &m) {
// };
// py::class_<Base12v2>(m, "Base12v2", b1, b2)
// .def(py::init<int, int>());
});
/* Test the case where not all base classes are specified,
and where pybind11 requires the py::multiple_inheritance
flag to perform proper casting between types */
struct
Base1a
{
Base1a
(
int
i
)
:
i
(
i
)
{
}
int
foo
()
{
return
i
;
}
int
i
;
};
struct
Base2a
{
Base2a
(
int
i
)
:
i
(
i
)
{
}
int
bar
()
{
return
i
;
}
int
i
;
};
struct
Base12a
:
Base1a
,
Base2a
{
Base12a
(
int
i
,
int
j
)
:
Base1a
(
i
),
Base2a
(
j
)
{
}
};
test_initializer
multiple_inheritance_nonexplicit
([](
py
::
module
&
m
)
{
// test_multiple_inheritance_virtbase
// Test the case where not all base classes are specified, and where pybind11 requires the
// py::multiple_inheritance flag to perform proper casting between types.
struct
Base1a
{
Base1a
(
int
i
)
:
i
(
i
)
{
}
int
foo
()
{
return
i
;
}
int
i
;
};
py
::
class_
<
Base1a
,
std
::
shared_ptr
<
Base1a
>>
(
m
,
"Base1a"
)
.
def
(
py
::
init
<
int
>
())
.
def
(
"foo"
,
&
Base1a
::
foo
);
struct
Base2a
{
Base2a
(
int
i
)
:
i
(
i
)
{
}
int
bar
()
{
return
i
;
}
int
i
;
};
py
::
class_
<
Base2a
,
std
::
shared_ptr
<
Base2a
>>
(
m
,
"Base2a"
)
.
def
(
py
::
init
<
int
>
())
.
def
(
"bar"
,
&
Base2a
::
bar
);
struct
Base12a
:
Base1a
,
Base2a
{
Base12a
(
int
i
,
int
j
)
:
Base1a
(
i
),
Base2a
(
j
)
{
}
};
py
::
class_
<
Base12a
,
/* Base1 missing */
Base2a
,
std
::
shared_ptr
<
Base12a
>>
(
m
,
"Base12a"
,
py
::
multiple_inheritance
())
.
def
(
py
::
init
<
int
,
int
>
());
m
.
def
(
"bar_base2a"
,
[](
Base2a
*
b
)
{
return
b
->
bar
();
});
m
.
def
(
"bar_base2a_sharedptr"
,
[](
std
::
shared_ptr
<
Base2a
>
b
)
{
return
b
->
bar
();
});
});
// Issue #801: invalid casting to derived type with MI bases
struct
I801B1
{
int
a
=
1
;
virtual
~
I801B1
()
=
default
;
};
struct
I801B
2
{
int
b
=
2
;
virtual
~
I801B
2
()
=
default
;
};
struct
I801
C
:
I801B1
,
I801B2
{
};
struct
I801
D
:
I801
C
{};
// Indirect MI
// Unregistered classes:
struct
I801B3
{
int
c
=
3
;
virtual
~
I801B3
()
=
default
;
};
struct
I801
E
:
I801B3
,
I801D
{
};
test_initializer
multiple_inheritance_casting
([](
py
::
module
&
m
)
{
// test_mi_unaligned_base
// test_mi_base_return
// Issue #801: invalid casting to derived type with MI bases
struct
I801B
1
{
int
a
=
1
;
virtual
~
I801B
1
()
=
default
;
};
struct
I801
B2
{
int
b
=
2
;
virtual
~
I801B2
()
=
default
;
};
struct
I801
C
:
I801
B1
,
I801B2
{};
struct
I801D
:
I801C
{};
// Indirect MI
// Unregistered classes:
struct
I801
B3
{
int
c
=
3
;
virtual
~
I801B3
()
=
default
;
};
struct
I801E
:
I801B3
,
I801D
{};
py
::
class_
<
I801B1
,
std
::
shared_ptr
<
I801B1
>>
(
m
,
"I801B1"
).
def
(
py
::
init
<>
()).
def_readonly
(
"a"
,
&
I801B1
::
a
);
py
::
class_
<
I801B2
,
std
::
shared_ptr
<
I801B2
>>
(
m
,
"I801B2"
).
def
(
py
::
init
<>
()).
def_readonly
(
"b"
,
&
I801B2
::
b
);
py
::
class_
<
I801C
,
I801B1
,
I801B2
,
std
::
shared_ptr
<
I801C
>>
(
m
,
"I801C"
).
def
(
py
::
init
<>
());
...
...
@@ -141,46 +163,9 @@ test_initializer multiple_inheritance_casting([](py::module &m) {
// isn't pybind-registered (and uses multiple-inheritance to offset the pybind base)
m
.
def
(
"i801e_c"
,
[]()
->
I801C
*
{
return
new
I801E
();
});
m
.
def
(
"i801e_b2"
,
[]()
->
I801B2
*
{
return
new
I801E
();
});
});
struct
Vanilla
{
std
::
string
vanilla
()
{
return
"Vanilla"
;
};
};
struct
WithStatic1
{
static
std
::
string
static_func1
()
{
return
"WithStatic1"
;
};
static
int
static_value1
;
};
struct
WithStatic2
{
static
std
::
string
static_func2
()
{
return
"WithStatic2"
;
};
static
int
static_value2
;
};
struct
WithDict
{
};
struct
VanillaStaticMix1
:
Vanilla
,
WithStatic1
,
WithStatic2
{
static
std
::
string
static_func
()
{
return
"VanillaStaticMix1"
;
}
static
int
static_value
;
};
struct
VanillaStaticMix2
:
WithStatic1
,
Vanilla
,
WithStatic2
{
static
std
::
string
static_func
()
{
return
"VanillaStaticMix2"
;
}
static
int
static_value
;
};
struct
VanillaDictMix1
:
Vanilla
,
WithDict
{
};
struct
VanillaDictMix2
:
WithDict
,
Vanilla
{
};
int
WithStatic1
::
static_value1
=
1
;
int
WithStatic2
::
static_value2
=
2
;
int
VanillaStaticMix1
::
static_value
=
12
;
int
VanillaStaticMix2
::
static_value
=
12
;
test_initializer
mi_static_properties
([](
py
::
module
&
pm
)
{
auto
m
=
pm
.
def_submodule
(
"mi"
);
// test_mi_static_properties
py
::
class_
<
Vanilla
>
(
m
,
"Vanilla"
)
.
def
(
py
::
init
<>
())
.
def
(
"vanilla"
,
&
Vanilla
::
vanilla
);
...
...
@@ -207,9 +192,13 @@ test_initializer mi_static_properties([](py::module &pm) {
.
def_static
(
"static_func"
,
&
VanillaStaticMix2
::
static_func
)
.
def_readwrite_static
(
"static_value"
,
&
VanillaStaticMix2
::
static_value
);
#if !defined(PYPY_VERSION)
struct
WithDict
{
};
struct
VanillaDictMix1
:
Vanilla
,
WithDict
{
};
struct
VanillaDictMix2
:
WithDict
,
Vanilla
{
};
py
::
class_
<
WithDict
>
(
m
,
"WithDict"
,
py
::
dynamic_attr
()).
def
(
py
::
init
<>
());
py
::
class_
<
VanillaDictMix1
,
Vanilla
,
WithDict
>
(
m
,
"VanillaDictMix1"
).
def
(
py
::
init
<>
());
py
::
class_
<
VanillaDictMix2
,
WithDict
,
Vanilla
>
(
m
,
"VanillaDictMix2"
).
def
(
py
::
init
<>
());
#endif
}
);
}
tests/test_multiple_inheritance.py
View file @
44a17e1f
import
pytest
from
pybind11_tests
import
ConstructorStats
from
pybind11_tests
import
multiple_inheritance
as
m
def
test_multiple_inheritance_cpp
():
from
pybind11_tests
import
MIType
mt
=
MIType
(
3
,
4
)
mt
=
m
.
MIType
(
3
,
4
)
assert
mt
.
foo
()
==
3
assert
mt
.
bar
()
==
4
def
test_multiple_inheritance_mix1
():
from
pybind11_tests
import
Base2
class
Base1
:
def
__init__
(
self
,
i
):
self
.
i
=
i
...
...
@@ -21,10 +18,10 @@ def test_multiple_inheritance_mix1():
def
foo
(
self
):
return
self
.
i
class
MITypePy
(
Base1
,
Base2
):
class
MITypePy
(
Base1
,
m
.
Base2
):
def
__init__
(
self
,
i
,
j
):
Base1
.
__init__
(
self
,
i
)
Base2
.
__init__
(
self
,
j
)
m
.
Base2
.
__init__
(
self
,
j
)
mt
=
MITypePy
(
3
,
4
)
...
...
@@ -33,7 +30,6 @@ def test_multiple_inheritance_mix1():
def
test_multiple_inheritance_mix2
():
from
pybind11_tests
import
Base1
class
Base2
:
def
__init__
(
self
,
i
):
...
...
@@ -42,9 +38,9 @@ def test_multiple_inheritance_mix2():
def
bar
(
self
):
return
self
.
i
class
MITypePy
(
Base1
,
Base2
):
class
MITypePy
(
m
.
Base1
,
Base2
):
def
__init__
(
self
,
i
,
j
):
Base1
.
__init__
(
self
,
i
)
m
.
Base1
.
__init__
(
self
,
i
)
Base2
.
__init__
(
self
,
j
)
mt
=
MITypePy
(
3
,
4
)
...
...
@@ -54,41 +50,40 @@ def test_multiple_inheritance_mix2():
def
test_multiple_inheritance_python
():
from
pybind11_tests
import
Base1
,
Base2
class
MI1
(
Base1
,
Base2
):
class
MI1
(
m
.
Base1
,
m
.
Base2
):
def
__init__
(
self
,
i
,
j
):
Base1
.
__init__
(
self
,
i
)
Base2
.
__init__
(
self
,
j
)
m
.
Base1
.
__init__
(
self
,
i
)
m
.
Base2
.
__init__
(
self
,
j
)
class
B1
(
object
):
def
v
(
self
):
return
1
class
MI2
(
B1
,
Base1
,
Base2
):
class
MI2
(
B1
,
m
.
Base1
,
m
.
Base2
):
def
__init__
(
self
,
i
,
j
):
B1
.
__init__
(
self
)
Base1
.
__init__
(
self
,
i
)
Base2
.
__init__
(
self
,
j
)
m
.
Base1
.
__init__
(
self
,
i
)
m
.
Base2
.
__init__
(
self
,
j
)
class
MI3
(
MI2
):
def
__init__
(
self
,
i
,
j
):
MI2
.
__init__
(
self
,
i
,
j
)
class
MI4
(
MI3
,
Base2
):
class
MI4
(
MI3
,
m
.
Base2
):
def
__init__
(
self
,
i
,
j
,
k
):
MI2
.
__init__
(
self
,
j
,
k
)
Base2
.
__init__
(
self
,
i
)
m
.
Base2
.
__init__
(
self
,
i
)
class
MI5
(
Base2
,
B1
,
Base1
):
class
MI5
(
m
.
Base2
,
B1
,
m
.
Base1
):
def
__init__
(
self
,
i
,
j
):
B1
.
__init__
(
self
)
Base1
.
__init__
(
self
,
i
)
Base2
.
__init__
(
self
,
j
)
m
.
Base1
.
__init__
(
self
,
i
)
m
.
Base2
.
__init__
(
self
,
j
)
class
MI6
(
Base2
,
B1
):
class
MI6
(
m
.
Base2
,
B1
):
def
__init__
(
self
,
i
):
Base2
.
__init__
(
self
,
i
)
m
.
Base2
.
__init__
(
self
,
i
)
B1
.
__init__
(
self
)
class
B2
(
B1
):
...
...
@@ -160,47 +155,45 @@ def test_multiple_inheritance_python():
def
test_multiple_inheritance_python_many_bases
():
from
pybind11_tests
import
(
BaseN1
,
BaseN2
,
BaseN3
,
BaseN4
,
BaseN5
,
BaseN6
,
BaseN7
,
BaseN8
,
BaseN9
,
BaseN10
,
BaseN11
,
BaseN12
,
BaseN13
,
BaseN14
,
BaseN15
,
BaseN16
,
BaseN17
)
class
MIMany14
(
BaseN1
,
BaseN2
,
BaseN3
,
BaseN4
):
class
MIMany14
(
m
.
BaseN1
,
m
.
BaseN2
,
m
.
BaseN3
,
m
.
BaseN4
):
def
__init__
(
self
):
BaseN1
.
__init__
(
self
,
1
)
BaseN2
.
__init__
(
self
,
2
)
BaseN3
.
__init__
(
self
,
3
)
BaseN4
.
__init__
(
self
,
4
)
m
.
BaseN1
.
__init__
(
self
,
1
)
m
.
BaseN2
.
__init__
(
self
,
2
)
m
.
BaseN3
.
__init__
(
self
,
3
)
m
.
BaseN4
.
__init__
(
self
,
4
)
class
MIMany58
(
BaseN5
,
BaseN6
,
BaseN7
,
BaseN8
):
class
MIMany58
(
m
.
BaseN5
,
m
.
BaseN6
,
m
.
BaseN7
,
m
.
BaseN8
):
def
__init__
(
self
):
BaseN5
.
__init__
(
self
,
5
)
BaseN6
.
__init__
(
self
,
6
)
BaseN7
.
__init__
(
self
,
7
)
BaseN8
.
__init__
(
self
,
8
)
m
.
BaseN5
.
__init__
(
self
,
5
)
m
.
BaseN6
.
__init__
(
self
,
6
)
m
.
BaseN7
.
__init__
(
self
,
7
)
m
.
BaseN8
.
__init__
(
self
,
8
)
class
MIMany916
(
BaseN9
,
BaseN10
,
BaseN11
,
BaseN12
,
BaseN13
,
BaseN14
,
BaseN15
,
BaseN16
):
class
MIMany916
(
m
.
BaseN9
,
m
.
BaseN10
,
m
.
BaseN11
,
m
.
BaseN12
,
m
.
BaseN13
,
m
.
BaseN14
,
m
.
BaseN15
,
m
.
BaseN16
):
def
__init__
(
self
):
BaseN9
.
__init__
(
self
,
9
)
BaseN10
.
__init__
(
self
,
10
)
BaseN11
.
__init__
(
self
,
11
)
BaseN12
.
__init__
(
self
,
12
)
BaseN13
.
__init__
(
self
,
13
)
BaseN14
.
__init__
(
self
,
14
)
BaseN15
.
__init__
(
self
,
15
)
BaseN16
.
__init__
(
self
,
16
)
class
MIMany19
(
MIMany14
,
MIMany58
,
BaseN9
):
m
.
BaseN9
.
__init__
(
self
,
9
)
m
.
BaseN10
.
__init__
(
self
,
10
)
m
.
BaseN11
.
__init__
(
self
,
11
)
m
.
BaseN12
.
__init__
(
self
,
12
)
m
.
BaseN13
.
__init__
(
self
,
13
)
m
.
BaseN14
.
__init__
(
self
,
14
)
m
.
BaseN15
.
__init__
(
self
,
15
)
m
.
BaseN16
.
__init__
(
self
,
16
)
class
MIMany19
(
MIMany14
,
MIMany58
,
m
.
BaseN9
):
def
__init__
(
self
):
MIMany14
.
__init__
(
self
)
MIMany58
.
__init__
(
self
)
BaseN9
.
__init__
(
self
,
9
)
m
.
BaseN9
.
__init__
(
self
,
9
)
class
MIMany117
(
MIMany14
,
MIMany58
,
MIMany916
,
BaseN17
):
class
MIMany117
(
MIMany14
,
MIMany58
,
MIMany916
,
m
.
BaseN17
):
def
__init__
(
self
):
MIMany14
.
__init__
(
self
)
MIMany58
.
__init__
(
self
)
MIMany916
.
__init__
(
self
)
BaseN17
.
__init__
(
self
,
17
)
m
.
BaseN17
.
__init__
(
self
,
17
)
# Inherits from 4 registered C++ classes: can fit in one pointer on any modern arch:
a
=
MIMany14
()
...
...
@@ -224,31 +217,29 @@ def test_multiple_inheritance_python_many_bases():
def
test_multiple_inheritance_virtbase
():
from
pybind11_tests
import
Base12a
,
bar_base2a
,
bar_base2a_sharedptr
class
MITypePy
(
Base12a
):
class
MITypePy
(
m
.
Base12a
):
def
__init__
(
self
,
i
,
j
):
Base12a
.
__init__
(
self
,
i
,
j
)
m
.
Base12a
.
__init__
(
self
,
i
,
j
)
mt
=
MITypePy
(
3
,
4
)
assert
mt
.
bar
()
==
4
assert
bar_base2a
(
mt
)
==
4
assert
bar_base2a_sharedptr
(
mt
)
==
4
assert
m
.
bar_base2a
(
mt
)
==
4
assert
m
.
bar_base2a_sharedptr
(
mt
)
==
4
def
test_mi_static_properties
():
"""Mixing bases with and without static properties should be possible
and the result should be independent of base definition order"""
from
pybind11_tests
import
mi
for
d
in
(
m
i
.
VanillaStaticMix1
(),
m
i
.
VanillaStaticMix2
()):
for
d
in
(
m
.
VanillaStaticMix1
(),
m
.
VanillaStaticMix2
()):
assert
d
.
vanilla
()
==
"Vanilla"
assert
d
.
static_func1
()
==
"WithStatic1"
assert
d
.
static_func2
()
==
"WithStatic2"
assert
d
.
static_func
()
==
d
.
__class__
.
__name__
m
i
.
WithStatic1
.
static_value1
=
1
m
i
.
WithStatic2
.
static_value2
=
2
m
.
WithStatic1
.
static_value1
=
1
m
.
WithStatic2
.
static_value2
=
2
assert
d
.
static_value1
==
1
assert
d
.
static_value2
==
2
assert
d
.
static_value
==
12
...
...
@@ -264,30 +255,28 @@ def test_mi_static_properties():
@
pytest
.
unsupported_on_pypy
def
test_mi_dynamic_attributes
():
"""Mixing bases with and without dynamic attribute support"""
from
pybind11_tests
import
mi
for
d
in
(
m
i
.
VanillaDictMix1
(),
m
i
.
VanillaDictMix2
()):
for
d
in
(
m
.
VanillaDictMix1
(),
m
.
VanillaDictMix2
()):
d
.
dynamic
=
1
assert
d
.
dynamic
==
1
def
test_mi_unaligned_base
():
"""Returning an offset (non-first MI) base class pointer should recognize the instance"""
from
pybind11_tests
import
I801C
,
I801D
,
i801b1_c
,
i801b2_c
,
i801b1_d
,
i801b2_d
n_inst
=
ConstructorStats
.
detail_reg_inst
()
c
=
I801C
()
d
=
I801D
()
c
=
m
.
I801C
()
d
=
m
.
I801D
()
# + 4 below because we have the two instances, and each instance has offset base I801B2
assert
ConstructorStats
.
detail_reg_inst
()
==
n_inst
+
4
b1c
=
i801b1_c
(
c
)
b1c
=
m
.
i801b1_c
(
c
)
assert
b1c
is
c
b2c
=
i801b2_c
(
c
)
b2c
=
m
.
i801b2_c
(
c
)
assert
b2c
is
c
b1d
=
i801b1_d
(
d
)
b1d
=
m
.
i801b1_d
(
d
)
assert
b1d
is
d
b2d
=
i801b2_d
(
d
)
b2d
=
m
.
i801b2_d
(
d
)
assert
b2d
is
d
assert
ConstructorStats
.
detail_reg_inst
()
==
n_inst
+
4
# no extra instances
...
...
@@ -299,30 +288,28 @@ def test_mi_unaligned_base():
def
test_mi_base_return
():
"""Tests returning an offset (non-first MI) base class pointer to a derived instance"""
from
pybind11_tests
import
(
I801B2
,
I801C
,
I801D
,
i801c_b1
,
i801c_b2
,
i801d_b1
,
i801d_b2
,
i801e_c
,
i801e_b2
)
n_inst
=
ConstructorStats
.
detail_reg_inst
()
c1
=
i801c_b1
()
assert
type
(
c1
)
is
I801C
c1
=
m
.
i801c_b1
()
assert
type
(
c1
)
is
m
.
I801C
assert
c1
.
a
==
1
assert
c1
.
b
==
2
d1
=
i801d_b1
()
assert
type
(
d1
)
is
I801D
d1
=
m
.
i801d_b1
()
assert
type
(
d1
)
is
m
.
I801D
assert
d1
.
a
==
1
assert
d1
.
b
==
2
assert
ConstructorStats
.
detail_reg_inst
()
==
n_inst
+
4
c2
=
i801c_b2
()
assert
type
(
c2
)
is
I801C
c2
=
m
.
i801c_b2
()
assert
type
(
c2
)
is
m
.
I801C
assert
c2
.
a
==
1
assert
c2
.
b
==
2
d2
=
i801d_b2
()
assert
type
(
d2
)
is
I801D
d2
=
m
.
i801d_b2
()
assert
type
(
d2
)
is
m
.
I801D
assert
d2
.
a
==
1
assert
d2
.
b
==
2
...
...
@@ -336,11 +323,11 @@ def test_mi_base_return():
# Returning an unregistered derived type with a registered base; we won't
# pick up the derived type, obviously, but should still work (as an object
# of whatever type was returned).
e1
=
i801e_c
()
assert
type
(
e1
)
is
I801C
e1
=
m
.
i801e_c
()
assert
type
(
e1
)
is
m
.
I801C
assert
e1
.
a
==
1
assert
e1
.
b
==
2
e2
=
i801e_b2
()
assert
type
(
e2
)
is
I801B2
e2
=
m
.
i801e_b2
()
assert
type
(
e2
)
is
m
.
I801B2
assert
e2
.
b
==
2
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment