2016-08-12 11:50:00 +00:00
|
|
|
import pytest
|
|
|
|
import gc
|
|
|
|
|
|
|
|
|
2016-08-12 20:28:31 +00:00
|
|
|
def test_regressions():
|
2016-08-12 11:50:00 +00:00
|
|
|
from pybind11_tests.issues import print_cchar, print_char
|
|
|
|
|
2016-08-12 20:28:31 +00:00
|
|
|
# #137: const char* isn't handled properly
|
|
|
|
assert print_cchar("const char *") == "const char *"
|
|
|
|
# #150: char bindings broken
|
|
|
|
assert print_char("c") == "c"
|
2016-08-12 11:50:00 +00:00
|
|
|
|
|
|
|
|
2016-08-12 20:28:31 +00:00
|
|
|
def test_dispatch_issue(msg):
|
2016-08-12 11:50:00 +00:00
|
|
|
"""#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):
|
2016-08-12 20:28:31 +00:00
|
|
|
return "Yay.."
|
2016-08-12 11:50:00 +00:00
|
|
|
|
|
|
|
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()
|
2016-08-12 20:28:31 +00:00
|
|
|
return dispatch_issue_go(p)
|
2016-08-12 11:50:00 +00:00
|
|
|
|
|
|
|
b = PyClass2()
|
2016-08-12 20:28:31 +00:00
|
|
|
assert dispatch_issue_go(b) == "Yay.."
|
2016-08-12 11:50:00 +00:00
|
|
|
|
|
|
|
|
|
|
|
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))
|
|
|
|
gc.collect()
|
|
|
|
for i, v in enumerate(el.get()):
|
|
|
|
assert i == v.value()
|
|
|
|
|
|
|
|
|
|
|
|
def test_no_id(capture, msg):
|
2016-08-19 11:45:36 +00:00
|
|
|
from pybind11_tests.issues import get_element, expect_float, expect_int
|
2016-08-12 11:50:00 +00:00
|
|
|
|
|
|
|
with pytest.raises(TypeError) as excinfo:
|
2016-08-19 11:45:36 +00:00
|
|
|
get_element(None)
|
2016-08-12 11:50:00 +00:00
|
|
|
assert msg(excinfo.value) == """
|
|
|
|
Incompatible function arguments. The following argument types are supported:
|
2016-08-19 11:45:36 +00:00
|
|
|
1. (arg0: m.issues.ElementA) -> int
|
2016-08-12 11:50:00 +00:00
|
|
|
Invoked with: None
|
|
|
|
"""
|
|
|
|
|
|
|
|
with pytest.raises(TypeError) as excinfo:
|
|
|
|
expect_int(5.2)
|
|
|
|
assert msg(excinfo.value) == """
|
|
|
|
Incompatible function arguments. The following argument types are supported:
|
|
|
|
1. (arg0: int) -> int
|
|
|
|
Invoked with: 5.2
|
|
|
|
"""
|
|
|
|
assert expect_float(12) == 12
|
|
|
|
|
|
|
|
from pybind11_tests.issues import A, call_f
|
|
|
|
|
|
|
|
class B(A):
|
|
|
|
def __init__(self):
|
|
|
|
super(B, self).__init__()
|
|
|
|
|
|
|
|
def f(self):
|
|
|
|
print("In python f()")
|
|
|
|
|
|
|
|
# C++ version
|
|
|
|
with capture:
|
|
|
|
a = A()
|
|
|
|
call_f(a)
|
|
|
|
assert capture == "A.f()"
|
|
|
|
|
|
|
|
# Python version
|
|
|
|
with capture:
|
|
|
|
b = B()
|
|
|
|
call_f(b)
|
|
|
|
assert capture == """
|
|
|
|
PyA.PyA()
|
|
|
|
PyA.f()
|
|
|
|
In python f()
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
2016-08-19 11:45:36 +00:00
|
|
|
def test_str_issue(msg):
|
2016-08-12 11:50:00 +00:00
|
|
|
"""Issue #283: __str__ called on uninitialized instance when constructor arguments invalid"""
|
|
|
|
from pybind11_tests.issues import StrIssue
|
|
|
|
|
2016-08-19 11:45:36 +00:00
|
|
|
assert str(StrIssue(3)) == "StrIssue[3]"
|
2016-08-12 11:50:00 +00:00
|
|
|
|
|
|
|
with pytest.raises(TypeError) as excinfo:
|
|
|
|
str(StrIssue("no", "such", "constructor"))
|
|
|
|
assert msg(excinfo.value) == """
|
|
|
|
Incompatible constructor arguments. The following argument types are supported:
|
|
|
|
1. m.issues.StrIssue(arg0: int)
|
|
|
|
2. m.issues.StrIssue()
|
|
|
|
Invoked with: no, such, constructor
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
2016-08-12 20:28:31 +00:00
|
|
|
def test_nested():
|
2016-08-12 11:50:00 +00:00
|
|
|
""" #328: first member in a class can't be used in operators"""
|
2016-08-12 20:28:31 +00:00
|
|
|
from pybind11_tests.issues import NestA, NestB, NestC, get_NestA, get_NestB, get_NestC
|
2016-08-12 11:50:00 +00:00
|
|
|
|
|
|
|
a = NestA()
|
|
|
|
b = NestB()
|
|
|
|
c = NestC()
|
|
|
|
|
|
|
|
a += 10
|
2016-08-12 20:28:31 +00:00
|
|
|
assert get_NestA(a) == 13
|
2016-08-12 11:50:00 +00:00
|
|
|
b.a += 100
|
2016-08-12 20:28:31 +00:00
|
|
|
assert get_NestA(b.a) == 103
|
2016-08-12 11:50:00 +00:00
|
|
|
c.b.a += 1000
|
2016-08-12 20:28:31 +00:00
|
|
|
assert get_NestA(c.b.a) == 1003
|
2016-08-12 11:50:00 +00:00
|
|
|
b -= 1
|
2016-08-12 20:28:31 +00:00
|
|
|
assert get_NestB(b) == 3
|
2016-08-12 11:50:00 +00:00
|
|
|
c.b -= 3
|
2016-08-12 20:28:31 +00:00
|
|
|
assert get_NestB(c.b) == 1
|
2016-08-12 11:50:00 +00:00
|
|
|
c *= 7
|
2016-08-12 20:28:31 +00:00
|
|
|
assert get_NestC(c) == 35
|
2016-08-12 11:50:00 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
gc.collect()
|
|
|
|
del a # Should't delete while abase is still alive
|
|
|
|
gc.collect()
|
|
|
|
|
|
|
|
assert abase.value == 42
|
|
|
|
del abase, b
|
|
|
|
gc.collect()
|
2016-09-06 15:47:17 +00:00
|
|
|
|
|
|
|
|
|
|
|
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
|
2016-09-07 17:32:49 +00:00
|
|
|
|
|
|
|
def test_override_ref():
|
|
|
|
from pybind11_tests.issues import OverrideTest
|
2016-09-08 15:03:08 +00:00
|
|
|
o = OverrideTest("asdf")
|
2016-09-07 17:32:49 +00:00
|
|
|
|
2016-09-07 17:38:32 +00:00
|
|
|
# Not allowed (see associated .cpp comment)
|
2016-09-08 15:03:08 +00:00
|
|
|
#i = o.str_ref()
|
|
|
|
#assert o.str_ref() == "asdf"
|
|
|
|
assert o.str_value() == "asdf"
|
2016-09-07 17:32:49 +00:00
|
|
|
|
2016-09-08 15:03:08 +00:00
|
|
|
assert o.A_value().value == "hi"
|
2016-09-07 17:32:49 +00:00
|
|
|
a = o.A_ref()
|
2016-09-08 15:03:08 +00:00
|
|
|
assert a.value == "hi"
|
|
|
|
a.value = "bye"
|
|
|
|
assert a.value == "bye"
|