test_opaque_types.py revision 12037:d28054ac6ec9
16691Stjones1@inf.ed.ac.ukimport pytest
26691Stjones1@inf.ed.ac.uk
36691Stjones1@inf.ed.ac.uk
46691Stjones1@inf.ed.ac.ukdef test_string_list():
56691Stjones1@inf.ed.ac.uk    from pybind11_tests import StringList, ClassWithSTLVecProperty, print_opaque_list
66691Stjones1@inf.ed.ac.uk
76691Stjones1@inf.ed.ac.uk    l = StringList()
86691Stjones1@inf.ed.ac.uk    l.push_back("Element 1")
96691Stjones1@inf.ed.ac.uk    l.push_back("Element 2")
106691Stjones1@inf.ed.ac.uk    assert print_opaque_list(l) == "Opaque list: [Element 1, Element 2]"
116691Stjones1@inf.ed.ac.uk    assert l.back() == "Element 2"
126691Stjones1@inf.ed.ac.uk
136691Stjones1@inf.ed.ac.uk    for i, k in enumerate(l, start=1):
146691Stjones1@inf.ed.ac.uk        assert k == "Element {}".format(i)
156691Stjones1@inf.ed.ac.uk    l.pop_back()
166691Stjones1@inf.ed.ac.uk    assert print_opaque_list(l) == "Opaque list: [Element 1]"
176691Stjones1@inf.ed.ac.uk
186691Stjones1@inf.ed.ac.uk    cvp = ClassWithSTLVecProperty()
196691Stjones1@inf.ed.ac.uk    assert print_opaque_list(cvp.stringList) == "Opaque list: []"
206691Stjones1@inf.ed.ac.uk
216691Stjones1@inf.ed.ac.uk    cvp.stringList = l
226691Stjones1@inf.ed.ac.uk    cvp.stringList.push_back("Element 3")
236691Stjones1@inf.ed.ac.uk    assert print_opaque_list(cvp.stringList) == "Opaque list: [Element 1, Element 3]"
246691Stjones1@inf.ed.ac.uk
256691Stjones1@inf.ed.ac.uk
266691Stjones1@inf.ed.ac.ukdef test_pointers(msg):
276691Stjones1@inf.ed.ac.uk    from pybind11_tests import (return_void_ptr, get_void_ptr_value, ExampleMandA,
286691Stjones1@inf.ed.ac.uk                                print_opaque_list, return_null_str, get_null_str_value,
296691Stjones1@inf.ed.ac.uk                                return_unique_ptr, ConstructorStats)
306691Stjones1@inf.ed.ac.uk
316691Stjones1@inf.ed.ac.uk    living_before = ConstructorStats.get(ExampleMandA).alive()
326691Stjones1@inf.ed.ac.uk    assert get_void_ptr_value(return_void_ptr()) == 0x1234
336691Stjones1@inf.ed.ac.uk    assert get_void_ptr_value(ExampleMandA())  # Should also work for other C++ types
346691Stjones1@inf.ed.ac.uk    assert ConstructorStats.get(ExampleMandA).alive() == living_before
356691Stjones1@inf.ed.ac.uk
366691Stjones1@inf.ed.ac.uk    with pytest.raises(TypeError) as excinfo:
376691Stjones1@inf.ed.ac.uk        get_void_ptr_value([1, 2, 3])  # This should not work
386691Stjones1@inf.ed.ac.uk    assert msg(excinfo.value) == """
396691Stjones1@inf.ed.ac.uk        get_void_ptr_value(): incompatible function arguments. The following argument types are supported:
406691Stjones1@inf.ed.ac.uk            1. (arg0: capsule) -> int
416691Stjones1@inf.ed.ac.uk
426691Stjones1@inf.ed.ac.uk        Invoked with: [1, 2, 3]
436691Stjones1@inf.ed.ac.uk    """  # noqa: E501 line too long
446691Stjones1@inf.ed.ac.uk
456691Stjones1@inf.ed.ac.uk    assert return_null_str() is None
466691Stjones1@inf.ed.ac.uk    assert get_null_str_value(return_null_str()) is not None
476691Stjones1@inf.ed.ac.uk
48    ptr = return_unique_ptr()
49    assert "StringList" in repr(ptr)
50    assert print_opaque_list(ptr) == "Opaque list: [some value]"
51