Skip to content

Commit 96bcf60

Browse files
committed
Adding test_isinstance_string_types, with asserts simply matching current behavior.
1 parent 4d90f1a commit 96bcf60

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

tests/test_pytypes.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,4 +367,11 @@ TEST_SUBMODULE(pytypes, m) {
367367
buf, static_cast<ssize_t>(strlen(buf)));
368368
});
369369
#endif
370+
371+
m.def("isinstance_pybind11_bytes", [](py::object o) { return py::isinstance<py::bytes>(o); });
372+
m.def("isinstance_pybind11_unicode", [](py::object o) { return py::isinstance<py::str>(o); });
373+
374+
m.def("pass_to_pybind11_bytes", [](py::bytes b) { return py::len(b); });
375+
m.def("pass_to_pybind11_unicode", [](py::str s) { return py::len(s); });
376+
m.def("pass_to_std_string", [](std::string s) { return s.size(); });
370377
}

tests/test_pytypes.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,3 +347,41 @@ def test_memoryview_from_memory():
347347
assert isinstance(view, memoryview)
348348
assert view.format == 'B'
349349
assert bytes(view) == b'\xff\xe1\xab\x37'
350+
351+
352+
def test_isinstance_string_types():
353+
actual_bytes = b""
354+
actual_unicode = u""
355+
if str is bytes:
356+
# Python 2: NOT same as native str, BUT same as pybind11::str
357+
native_unicode_type = unicode # noqa: F821
358+
else:
359+
# Python 3: same as pybind11::str
360+
native_unicode_type = str
361+
362+
# Native isinstance, for comparison with below.
363+
assert isinstance(actual_bytes, bytes)
364+
assert not isinstance(actual_unicode, bytes)
365+
assert not isinstance(actual_bytes, native_unicode_type)
366+
assert isinstance(actual_unicode, native_unicode_type)
367+
368+
# pybind11 isinstance
369+
assert m.isinstance_pybind11_bytes(actual_bytes)
370+
assert not m.isinstance_pybind11_bytes(actual_unicode)
371+
assert m.isinstance_pybind11_unicode(actual_bytes) # NOT like native
372+
assert m.isinstance_pybind11_unicode(actual_unicode)
373+
374+
375+
def test_pass_actual_bytes_or_unicode_to_string_types():
376+
actual_bytes = b"Bytes"
377+
actual_unicode = u"Str"
378+
379+
assert m.pass_to_pybind11_bytes(actual_bytes) == 5
380+
with pytest.raises(TypeError):
381+
m.pass_to_pybind11_bytes(actual_unicode) # NO implicit encode
382+
383+
assert m.pass_to_pybind11_unicode(actual_bytes) == 5 # implicit decode
384+
assert m.pass_to_pybind11_unicode(actual_unicode) == 3
385+
386+
assert m.pass_to_std_string(actual_bytes) == 5
387+
assert m.pass_to_std_string(actual_unicode) == 3

0 commit comments

Comments
 (0)