aboutsummaryrefslogtreecommitdiffstats
path: root/3rdparty/pybind11/tests/test_exceptions.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_exceptions.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_exceptions.py')
-rw-r--r--3rdparty/pybind11/tests/test_exceptions.py52
1 files changed, 50 insertions, 2 deletions
diff --git a/3rdparty/pybind11/tests/test_exceptions.py b/3rdparty/pybind11/tests/test_exceptions.py
index ac2b3603..95eac709 100644
--- a/3rdparty/pybind11/tests/test_exceptions.py
+++ b/3rdparty/pybind11/tests/test_exceptions.py
@@ -1,3 +1,6 @@
+# -*- coding: utf-8 -*-
+import sys
+
import pytest
from pybind11_tests import exceptions as m
@@ -47,6 +50,33 @@ def test_python_call_in_catch():
assert d["good"] is True
+def test_python_alreadyset_in_destructor(monkeypatch, capsys):
+ hooked = False
+ triggered = [False] # mutable, so Python 2.7 closure can modify it
+
+ if hasattr(sys, "unraisablehook"): # Python 3.8+
+ hooked = True
+ default_hook = sys.unraisablehook
+
+ def hook(unraisable_hook_args):
+ exc_type, exc_value, exc_tb, err_msg, obj = unraisable_hook_args
+ if obj == "already_set demo":
+ triggered[0] = True
+ default_hook(unraisable_hook_args)
+ return
+
+ # Use monkeypatch so pytest can apply and remove the patch as appropriate
+ monkeypatch.setattr(sys, "unraisablehook", hook)
+
+ assert m.python_alreadyset_in_destructor("already_set demo") is True
+ if hooked:
+ assert triggered[0] is True
+
+ _, captured_stderr = capsys.readouterr()
+ # Error message is different in Python 2 and 3, check for words that appear in both
+ assert "ignored" in captured_stderr and "already_set demo" in captured_stderr
+
+
def test_exception_matches():
assert m.exception_matches()
assert m.exception_matches_base()
@@ -77,7 +107,9 @@ def test_custom(msg):
# Can we fall-through to the default handler?
with pytest.raises(RuntimeError) as excinfo:
m.throws_logic_error()
- assert msg(excinfo.value) == "this error should fall through to the standard handler"
+ assert (
+ msg(excinfo.value) == "this error should fall through to the standard handler"
+ )
# OverFlow error translation.
with pytest.raises(OverflowError) as excinfo:
@@ -136,7 +168,13 @@ def test_nested_throws(capture):
# C++ -> Python -> C++ -> Python
with capture:
m.try_catch(
- m.MyException5, pycatch, m.MyException, m.try_catch, m.MyException, throw_myex5)
+ m.MyException5,
+ pycatch,
+ m.MyException,
+ m.try_catch,
+ m.MyException,
+ throw_myex5,
+ )
assert str(capture).startswith("MyException5: nested error 5")
# C++ -> Python -> C++
@@ -148,3 +186,13 @@ def test_nested_throws(capture):
with pytest.raises(m.MyException5) as excinfo:
m.try_catch(m.MyException, pycatch, m.MyException, m.throws5)
assert str(excinfo.value) == "this is a helper-defined translated exception"
+
+
+# This can often happen if you wrap a pybind11 class in a Python wrapper
+def test_invalid_repr():
+ class MyRepr(object):
+ def __repr__(self):
+ raise AttributeError("Example error")
+
+ with pytest.raises(TypeError):
+ m.simple_bool_passthrough(MyRepr())