aboutsummaryrefslogtreecommitdiffstats
path: root/3rdparty/pybind11/tests/test_methods_and_attributes.py
diff options
context:
space:
mode:
authorMiodrag Milanovic <mmicko@gmail.com>2021-01-02 10:15:39 +0100
committerMiodrag Milanovic <mmicko@gmail.com>2021-01-02 10:15:39 +0100
commite76cdab6dd77bad411e6ac9372ee527aff89ef17 (patch)
treee9868f05cf455336d75f33b1312d71034f8fb334 /3rdparty/pybind11/tests/test_methods_and_attributes.py
parentc6cdf30501dcb2da01361229dd66a05dad73a132 (diff)
downloadnextpnr-e76cdab6dd77bad411e6ac9372ee527aff89ef17.tar.gz
nextpnr-e76cdab6dd77bad411e6ac9372ee527aff89ef17.tar.bz2
nextpnr-e76cdab6dd77bad411e6ac9372ee527aff89ef17.zip
Update pybind11 to version 2.6.1
Diffstat (limited to '3rdparty/pybind11/tests/test_methods_and_attributes.py')
-rw-r--r--3rdparty/pybind11/tests/test_methods_and_attributes.py223
1 files changed, 109 insertions, 114 deletions
diff --git a/3rdparty/pybind11/tests/test_methods_and_attributes.py b/3rdparty/pybind11/tests/test_methods_and_attributes.py
index f1c862be..2aaf9331 100644
--- a/3rdparty/pybind11/tests/test_methods_and_attributes.py
+++ b/3rdparty/pybind11/tests/test_methods_and_attributes.py
@@ -1,4 +1,8 @@
+# -*- coding: utf-8 -*-
import pytest
+
+import env # noqa: F401
+
from pybind11_tests import methods_and_attributes as m
from pybind11_tests import ConstructorStats
@@ -36,17 +40,17 @@ def test_methods_and_attributes():
assert instance1.overloaded(0) == "(int)"
assert instance1.overloaded(1, 1.0) == "(int, float)"
assert instance1.overloaded(2.0, 2) == "(float, int)"
- assert instance1.overloaded(3, 3) == "(int, int)"
- assert instance1.overloaded(4., 4.) == "(float, float)"
+ assert instance1.overloaded(3, 3) == "(int, int)"
+ assert instance1.overloaded(4.0, 4.0) == "(float, float)"
assert instance1.overloaded_const(-3) == "(int) const"
assert instance1.overloaded_const(5, 5.0) == "(int, float) const"
assert instance1.overloaded_const(6.0, 6) == "(float, int) const"
- assert instance1.overloaded_const(7, 7) == "(int, int) const"
- assert instance1.overloaded_const(8., 8.) == "(float, float) const"
+ assert instance1.overloaded_const(7, 7) == "(int, int) const"
+ assert instance1.overloaded_const(8.0, 8.0) == "(float, float) const"
assert instance1.overloaded_float(1, 1) == "(float, float)"
- assert instance1.overloaded_float(1, 1.) == "(float, float)"
- assert instance1.overloaded_float(1., 1) == "(float, float)"
- assert instance1.overloaded_float(1., 1.) == "(float, float)"
+ assert instance1.overloaded_float(1, 1.0) == "(float, float)"
+ assert instance1.overloaded_float(1.0, 1) == "(float, float)"
+ assert instance1.overloaded_float(1.0, 1.0) == "(float, float)"
assert instance1.value == 320
instance1.value = 100
@@ -58,8 +62,8 @@ def test_methods_and_attributes():
assert cstats.alive() == 0
assert cstats.values() == ["32"]
assert cstats.default_constructions == 1
- assert cstats.copy_constructions == 3
- assert cstats.move_constructions >= 1
+ assert cstats.copy_constructions == 2
+ assert cstats.move_constructions >= 2
assert cstats.copy_assignments == 0
assert cstats.move_assignments == 0
@@ -167,6 +171,19 @@ def test_static_properties():
assert m.TestPropertiesOverride().def_readonly == 99
assert m.TestPropertiesOverride.def_readonly_static == 99
+ # Only static attributes can be deleted
+ del m.TestPropertiesOverride.def_readonly_static
+ assert (
+ hasattr(m.TestPropertiesOverride, "def_readonly_static")
+ and m.TestPropertiesOverride.def_readonly_static
+ is m.TestProperties.def_readonly_static
+ )
+ assert "def_readonly_static" not in m.TestPropertiesOverride.__dict__
+ properties_override = m.TestPropertiesOverride()
+ with pytest.raises(AttributeError) as excinfo:
+ del properties_override.def_readonly
+ assert "can't delete attribute" in str(excinfo.value)
+
def test_static_cls():
"""Static property getter and setters expect the type object as the their only argument"""
@@ -189,7 +206,10 @@ def test_metaclass_override():
assert type(m.MetaclassOverride).__name__ == "type"
assert m.MetaclassOverride.readonly == 1
- assert type(m.MetaclassOverride.__dict__["readonly"]).__name__ == "pybind11_static_property"
+ assert (
+ type(m.MetaclassOverride.__dict__["readonly"]).__name__
+ == "pybind11_static_property"
+ )
# Regular `type` replaces the property instead of calling `__set__()`
m.MetaclassOverride.readonly = 2
@@ -202,22 +222,26 @@ def test_no_mixed_overloads():
with pytest.raises(RuntimeError) as excinfo:
m.ExampleMandA.add_mixed_overloads1()
- assert (str(excinfo.value) ==
- "overloading a method with both static and instance methods is not supported; " +
- ("compile in debug mode for more details" if not debug_enabled else
- "error while attempting to bind static method ExampleMandA.overload_mixed1"
- "(arg0: float) -> str")
- )
+ assert str(
+ excinfo.value
+ ) == "overloading a method with both static and instance methods is not supported; " + (
+ "compile in debug mode for more details"
+ if not debug_enabled
+ else "error while attempting to bind static method ExampleMandA.overload_mixed1"
+ "(arg0: float) -> str"
+ )
with pytest.raises(RuntimeError) as excinfo:
m.ExampleMandA.add_mixed_overloads2()
- assert (str(excinfo.value) ==
- "overloading a method with both static and instance methods is not supported; " +
- ("compile in debug mode for more details" if not debug_enabled else
- "error while attempting to bind instance method ExampleMandA.overload_mixed2"
- "(self: pybind11_tests.methods_and_attributes.ExampleMandA, arg0: int, arg1: int)"
- " -> str")
- )
+ assert str(
+ excinfo.value
+ ) == "overloading a method with both static and instance methods is not supported; " + (
+ "compile in debug mode for more details"
+ if not debug_enabled
+ else "error while attempting to bind instance method ExampleMandA.overload_mixed2"
+ "(self: pybind11_tests.methods_and_attributes.ExampleMandA, arg0: int, arg1: int)"
+ " -> str"
+ )
@pytest.mark.parametrize("access", ["ro", "rw", "static_ro", "static_rw"])
@@ -256,8 +280,8 @@ def test_property_rvalue_policy():
assert os.value == 1
-# https://bitbucket.org/pypy/pypy/issues/2447
-@pytest.unsupported_on_pypy
+# https://foss.heptapod.net/pypy/pypy/-/issues/2447
+@pytest.mark.xfail("env.PYPY")
def test_dynamic_attributes():
instance = m.DynamicClass()
assert not hasattr(instance, "foo")
@@ -298,8 +322,8 @@ def test_dynamic_attributes():
assert cstats.alive() == 0
-# https://bitbucket.org/pypy/pypy/issues/2447
-@pytest.unsupported_on_pypy
+# https://foss.heptapod.net/pypy/pypy/-/issues/2447
+@pytest.mark.xfail("env.PYPY")
def test_cyclic_gc():
# One object references itself
instance = m.DynamicClass()
@@ -321,69 +345,6 @@ def test_cyclic_gc():
assert cstats.alive() == 0
-def test_noconvert_args(msg):
- a = m.ArgInspector()
- assert msg(a.f("hi")) == """
- loading ArgInspector1 argument WITH conversion allowed. Argument value = hi
- """
- assert msg(a.g("this is a", "this is b")) == """
- loading ArgInspector1 argument WITHOUT conversion allowed. Argument value = this is a
- loading ArgInspector1 argument WITH conversion allowed. Argument value = this is b
- 13
- loading ArgInspector2 argument WITH conversion allowed. Argument value = (default arg inspector 2)
- """ # noqa: E501 line too long
- assert msg(a.g("this is a", "this is b", 42)) == """
- loading ArgInspector1 argument WITHOUT conversion allowed. Argument value = this is a
- loading ArgInspector1 argument WITH conversion allowed. Argument value = this is b
- 42
- loading ArgInspector2 argument WITH conversion allowed. Argument value = (default arg inspector 2)
- """ # noqa: E501 line too long
- assert msg(a.g("this is a", "this is b", 42, "this is d")) == """
- loading ArgInspector1 argument WITHOUT conversion allowed. Argument value = this is a
- loading ArgInspector1 argument WITH conversion allowed. Argument value = this is b
- 42
- loading ArgInspector2 argument WITH conversion allowed. Argument value = this is d
- """
- assert (a.h("arg 1") ==
- "loading ArgInspector2 argument WITHOUT conversion allowed. Argument value = arg 1")
- assert msg(m.arg_inspect_func("A1", "A2")) == """
- loading ArgInspector2 argument WITH conversion allowed. Argument value = A1
- loading ArgInspector1 argument WITHOUT conversion allowed. Argument value = A2
- """
-
- assert m.floats_preferred(4) == 2.0
- assert m.floats_only(4.0) == 2.0
- with pytest.raises(TypeError) as excinfo:
- m.floats_only(4)
- assert msg(excinfo.value) == """
- floats_only(): incompatible function arguments. The following argument types are supported:
- 1. (f: float) -> float
-
- Invoked with: 4
- """
-
- assert m.ints_preferred(4) == 2
- assert m.ints_preferred(True) == 0
- with pytest.raises(TypeError) as excinfo:
- m.ints_preferred(4.0)
- assert msg(excinfo.value) == """
- ints_preferred(): incompatible function arguments. The following argument types are supported:
- 1. (i: int) -> int
-
- Invoked with: 4.0
- """ # noqa: E501 line too long
-
- assert m.ints_only(4) == 2
- with pytest.raises(TypeError) as excinfo:
- m.ints_only(4.0)
- assert msg(excinfo.value) == """
- ints_only(): incompatible function arguments. The following argument types are supported:
- 1. (i: int) -> int
-
- Invoked with: 4.0
- """
-
-
def test_bad_arg_default(msg):
from pybind11_tests import debug_enabled
@@ -392,8 +353,8 @@ def test_bad_arg_default(msg):
assert msg(excinfo.value) == (
"arg(): could not convert default argument 'a: UnregisteredType' in function "
"'should_fail' into a Python object (type not registered yet?)"
- if debug_enabled else
- "arg(): could not convert default argument into a Python object (type not registered "
+ if debug_enabled
+ else "arg(): could not convert default argument into a Python object (type not registered "
"yet?). Compile in debug mode for more information."
)
@@ -402,8 +363,8 @@ def test_bad_arg_default(msg):
assert msg(excinfo.value) == (
"arg(): could not convert default argument 'UnregisteredType' in function "
"'should_fail' into a Python object (type not registered yet?)"
- if debug_enabled else
- "arg(): could not convert default argument into a Python object (type not registered "
+ if debug_enabled
+ else "arg(): could not convert default argument into a Python object (type not registered "
"yet?). Compile in debug mode for more information."
)
@@ -440,12 +401,15 @@ def test_accepts_none(msg):
# The first one still raises because you can't pass None as a lvalue reference arg:
with pytest.raises(TypeError) as excinfo:
assert m.ok_none1(None) == -1
- assert msg(excinfo.value) == """
+ assert (
+ msg(excinfo.value)
+ == """
ok_none1(): incompatible function arguments. The following argument types are supported:
1. (arg0: m.methods_and_attributes.NoneTester) -> int
Invoked with: None
"""
+ )
# The rest take the argument as pointer or holder, and accept None:
assert m.ok_none2(None) == -1
@@ -453,6 +417,19 @@ def test_accepts_none(msg):
assert m.ok_none4(None) == -1
assert m.ok_none5(None) == -1
+ with pytest.raises(TypeError) as excinfo:
+ m.no_none_kwarg(None)
+ assert "incompatible function arguments" in str(excinfo.value)
+ with pytest.raises(TypeError) as excinfo:
+ m.no_none_kwarg(a=None)
+ assert "incompatible function arguments" in str(excinfo.value)
+ with pytest.raises(TypeError) as excinfo:
+ m.no_none_kwarg_kw_only(None)
+ assert "incompatible function arguments" in str(excinfo.value)
+ with pytest.raises(TypeError) as excinfo:
+ m.no_none_kwarg_kw_only(a=None)
+ assert "incompatible function arguments" in str(excinfo.value)
+
def test_str_issue(msg):
"""#283: __str__ called on uninitialized instance when constructor arguments invalid"""
@@ -461,13 +438,16 @@ def test_str_issue(msg):
with pytest.raises(TypeError) as excinfo:
str(m.StrIssue("no", "such", "constructor"))
- assert msg(excinfo.value) == """
+ assert (
+ msg(excinfo.value)
+ == """
__init__(): incompatible constructor arguments. The following argument types are supported:
1. m.methods_and_attributes.StrIssue(arg0: int)
2. m.methods_and_attributes.StrIssue()
Invoked with: 'no', 'such', 'constructor'
"""
+ )
def test_unregistered_base_implementations():
@@ -488,25 +468,40 @@ def test_unregistered_base_implementations():
assert a.ro_value_prop == 1.75
-def test_custom_caster_destruction():
- """Tests that returning a pointer to a type that gets converted with a custom type caster gets
- destroyed when the function has py::return_value_policy::take_ownership policy applied."""
+def test_ref_qualified():
+ """Tests that explicit lvalue ref-qualified methods can be called just like their
+ non ref-qualified counterparts."""
- cstats = m.destruction_tester_cstats()
- # This one *doesn't* have take_ownership: the pointer should be used but not destroyed:
- z = m.custom_caster_no_destroy()
- assert cstats.alive() == 1 and cstats.default_constructions == 1
- assert z
+ r = m.RefQualified()
+ assert r.value == 0
+ r.refQualified(17)
+ assert r.value == 17
+ assert r.constRefQualified(23) == 40
- # take_ownership applied: this constructs a new object, casts it, then destroys it:
- z = m.custom_caster_destroy()
- assert z
- assert cstats.default_constructions == 2
- # Same, but with a const pointer return (which should *not* inhibit destruction):
- z = m.custom_caster_destroy_const()
- assert z
- assert cstats.default_constructions == 3
+def test_overload_ordering():
+ "Check to see if the normal overload order (first defined) and prepend overload order works"
+ assert m.overload_order("string") == 1
+ assert m.overload_order(0) == 4
- # Make sure we still only have the original object (from ..._no_destroy()) alive:
- assert cstats.alive() == 1
+ # Different for Python 2 vs. 3
+ uni_name = type(u"").__name__
+
+ assert "1. overload_order(arg0: int) -> int" in m.overload_order.__doc__
+ assert (
+ "2. overload_order(arg0: {}) -> int".format(uni_name)
+ in m.overload_order.__doc__
+ )
+ assert (
+ "3. overload_order(arg0: {}) -> int".format(uni_name)
+ in m.overload_order.__doc__
+ )
+ assert "4. overload_order(arg0: int) -> int" in m.overload_order.__doc__
+
+ with pytest.raises(TypeError) as err:
+ m.overload_order(1.1)
+
+ assert "1. (arg0: int) -> int" in str(err.value)
+ assert "2. (arg0: {}) -> int".format(uni_name) in str(err.value)
+ assert "3. (arg0: {}) -> int".format(uni_name) in str(err.value)
+ assert "4. (arg0: int) -> int" in str(err.value)