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