import pytest from pybind11_tests import ConstructorStats def test_regressions(): from pybind11_tests.issues import print_cchar, print_char # #137: const char* isn't handled properly assert print_cchar("const char *") == "const char *" # #150: char bindings broken assert print_char("c") == "c" def test_dispatch_issue(msg): """#159: virtual function dispatch has problems with similar-named functions""" from pybind11_tests.issues import DispatchIssue, dispatch_issue_go class PyClass1(DispatchIssue): def dispatch(self): return "Yay.." class PyClass2(DispatchIssue): def dispatch(self): with pytest.raises(RuntimeError) as excinfo: super(PyClass2, self).dispatch() assert msg(excinfo.value) == 'Tried to call pure virtual function "Base::dispatch"' p = PyClass1() return dispatch_issue_go(p) b = PyClass2() assert dispatch_issue_go(b) == "Yay.." def test_reference_wrapper(): """#171: Can't return reference wrappers (or STL data structures containing them)""" from pybind11_tests.issues import Placeholder, return_vec_of_reference_wrapper assert str(return_vec_of_reference_wrapper(Placeholder(4))) == \ "[Placeholder[1], Placeholder[2], Placeholder[3], Placeholder[4]]" def test_iterator_passthrough(): """#181: iterator passthrough did not compile""" from pybind11_tests.issues import iterator_passthrough assert list(iterator_passthrough(iter([3, 5, 7, 9, 11, 13, 15]))) == [3, 5, 7, 9, 11, 13, 15] def test_shared_ptr_gc(): """// #187: issue involving std::shared_ptr<> return value policy & garbage collection""" from pybind11_tests.issues import ElementList, ElementA el = ElementList() for i in range(10): el.add(ElementA(i)) pytest.gc_collect() for i, v in enumerate(el.get()): assert i == v.value() def test_no_id(msg): from pybind11_tests.issues import get_element, expect_float, expect_int with pytest.raises(TypeError) as excinfo: get_element(None) assert msg(excinfo.value) == """ get_element(): incompatible function arguments. The following argument types are supported: 1. (arg0: m.issues.ElementA) -> int Invoked with: None """ with pytest.raises(TypeError) as excinfo: expect_int(5.2) assert msg(excinfo.value) == """ expect_int(): incompatible function arguments. The following argument types are supported: 1. (arg0: int) -> int Invoked with: 5.2 """ assert expect_float(12) == 12 def test_str_issue(msg): """Issue #283: __str__ called on uninitialized instance when constructor arguments invalid""" from pybind11_tests.issues import StrIssue assert str(StrIssue(3)) == "StrIssue[3]" with pytest.raises(TypeError) as excinfo: str(StrIssue("no", "such", "constructor")) assert msg(excinfo.value) == """ __init__(): incompatible constructor arguments. The following argument types are supported: 1. m.issues.StrIssue(arg0: int) 2. m.issues.StrIssue() Invoked with: 'no', 'such', 'constructor' """ def test_nested(): """ #328: first member in a class can't be used in operators""" from pybind11_tests.issues import NestA, NestB, NestC, get_NestA, get_NestB, get_NestC a = NestA() b = NestB() c = NestC() a += 10 assert get_NestA(a) == 13 b.a += 100 assert get_NestA(b.a) == 103 c.b.a += 1000 assert get_NestA(c.b.a) == 1003 b -= 1 assert get_NestB(b) == 3 c.b -= 3 assert get_NestB(c.b) == 1 c *= 7 assert get_NestC(c) == 35 abase = a.as_base() assert abase.value == -2 a.as_base().value += 44 assert abase.value == 42 assert c.b.a.as_base().value == -2 c.b.a.as_base().value += 44 assert c.b.a.as_base().value == 42 del c pytest.gc_collect() del a # Should't delete while abase is still alive pytest.gc_collect() assert abase.value == 42 del abase, b pytest.gc_collect() def test_move_fallback(): from pybind11_tests.issues import get_moveissue1, get_moveissue2 m2 = get_moveissue2(2) assert m2.value == 2 m1 = get_moveissue1(1) assert m1.value == 1 def test_override_ref(): from pybind11_tests.issues import OverrideTest o = OverrideTest("asdf") # Not allowed (see associated .cpp comment) # i = o.str_ref() # assert o.str_ref() == "asdf" assert o.str_value() == "asdf" assert o.A_value().value == "hi" a = o.A_ref() assert a.value == "hi" a.value = "bye" assert a.value == "bye" def test_operators_notimplemented(capture): from pybind11_tests.issues import OpTest1, OpTest2 with capture: c1, c2 = OpTest1(), OpTest2() c1 + c1 c2 + c2 c2 + c1 c1 + c2 assert capture == """ Add OpTest1 with OpTest1 Add OpTest2 with OpTest2 Add OpTest2 with OpTest1 Add OpTest2 with OpTest1 """ def test_iterator_rvpolicy(): """ Issue 388: Can't make iterators via make_iterator() with different r/v policies """ from pybind11_tests.issues import make_iterator_1 from pybind11_tests.issues import make_iterator_2 assert list(make_iterator_1()) == [1, 2, 3] assert list(make_iterator_2()) == [1, 2, 3] assert not isinstance(make_iterator_1(), type(make_iterator_2())) def test_dupe_assignment(): """ Issue 461: overwriting a class with a function """ from pybind11_tests.issues import dupe_exception_failures assert dupe_exception_failures() == [] def test_enable_shared_from_this_with_reference_rvp(): """ Issue #471: shared pointer instance not dellocated """ from pybind11_tests import SharedParent, SharedChild parent = SharedParent() child = parent.get_child() cstats = ConstructorStats.get(SharedChild) assert cstats.alive() == 1 del child, parent assert cstats.alive() == 0 def test_non_destructed_holders(): """ Issue #478: unique ptrs constructed and freed without destruction """ from pybind11_tests import SpecialHolderObj a = SpecialHolderObj(123) b = a.child() assert a.val == 123 assert b.val == 124 cstats = SpecialHolderObj.holder_cstats() assert cstats.alive() == 1 del b assert cstats.alive() == 1 del a assert cstats.alive() == 0 def test_complex_cast(capture): """ Issue #484: number conversion generates unhandled exceptions """ from pybind11_tests.issues import test_complex with capture: test_complex(1) test_complex(2j) assert capture == """ 1.0 (0.0, 2.0) """ def test_inheritance_override_def_static(): from pybind11_tests.issues import MyBase, MyDerived b = MyBase.make() d1 = MyDerived.make2() d2 = MyDerived.make() assert isinstance(b, MyBase) assert isinstance(d1, MyDerived) assert isinstance(d2, MyDerived)