| 73 | PYBIND11_NAMESPACE_END(pybind11) |
| 74 | |
| 75 | TEST_SUBMODULE(builtin_casters, m) { |
| 76 | PYBIND11_WARNING_PUSH |
| 77 | PYBIND11_WARNING_DISABLE_MSVC(4127) |
| 78 | |
| 79 | // test_simple_string |
| 80 | m.def("string_roundtrip", [](const char *s) { return s; }); |
| 81 | |
| 82 | // test_unicode_conversion |
| 83 | // Some test characters in utf16 and utf32 encodings. The last one (the 𝐀) contains a null |
| 84 | // byte |
| 85 | char32_t a32 = 0x61 /*a*/, z32 = 0x7a /*z*/, ib32 = 0x203d /*‽*/, cake32 = 0x1f382 /*🎂*/, |
| 86 | mathbfA32 = 0x1d400 /*𝐀*/; |
| 87 | char16_t b16 = 0x62 /*b*/, z16 = 0x7a, ib16 = 0x203d, cake16_1 = 0xd83c, cake16_2 = 0xdf82, |
| 88 | mathbfA16_1 = 0xd835, mathbfA16_2 = 0xdc00; |
| 89 | std::wstring wstr; |
| 90 | wstr.push_back(0x61); // a |
| 91 | wstr.push_back(0x2e18); // ⸘ |
| 92 | if (sizeof(wchar_t) == 2) { |
| 93 | wstr.push_back(mathbfA16_1); |
| 94 | wstr.push_back(mathbfA16_2); |
| 95 | } // 𝐀, utf16 |
| 96 | else { |
| 97 | wstr.push_back((wchar_t) mathbfA32); |
| 98 | } // 𝐀, utf32 |
| 99 | wstr.push_back(0x7a); // z |
| 100 | |
| 101 | m.def("good_utf8_string", []() { |
| 102 | return std::string((const char *) u8"Say utf8\u203d \U0001f382 \U0001d400"); |
| 103 | }); // Say utf8‽ 🎂 𝐀 |
| 104 | m.def("good_utf16_string", [=]() { |
| 105 | return std::u16string({b16, ib16, cake16_1, cake16_2, mathbfA16_1, mathbfA16_2, z16}); |
| 106 | }); // b‽🎂𝐀z |
| 107 | m.def("good_utf32_string", |
| 108 | [=]() { return std::u32string({a32, mathbfA32, cake32, ib32, z32}); }); // a𝐀🎂‽z |
| 109 | m.def("good_wchar_string", [=]() { return wstr; }); // a‽𝐀z |
| 110 | m.def("bad_utf8_string", []() { |
| 111 | return std::string("abc\xd0" |
| 112 | "def"); |
| 113 | }); |
| 114 | m.def("bad_utf16_string", [=]() { return std::u16string({b16, char16_t(0xd800), z16}); }); |
| 115 | // Under Python 2.7, invalid unicode UTF-32 characters didn't appear to trigger |
| 116 | // UnicodeDecodeError |
| 117 | m.def("bad_utf32_string", [=]() { return std::u32string({a32, char32_t(0xd800), z32}); }); |
| 118 | if (sizeof(wchar_t) == 2) { |
| 119 | m.def("bad_wchar_string", |
| 120 | [=]() { return std::wstring({wchar_t(0x61), wchar_t(0xd800)}); }); |
| 121 | } |
| 122 | m.def("u8_Z", []() -> char { return 'Z'; }); |
| 123 | m.def("u8_eacute", []() -> char { return '\xe9'; }); |
| 124 | m.def("u16_ibang", [=]() -> char16_t { return ib16; }); |
| 125 | m.def("u32_mathbfA", [=]() -> char32_t { return mathbfA32; }); |
| 126 | m.def("wchar_heart", []() -> wchar_t { return 0x2665; }); |
| 127 | |
| 128 | // test_single_char_arguments |
| 129 | m.attr("wchar_size") = py::cast(sizeof(wchar_t)); |
| 130 | m.def("ord_char", [](char c) -> int { return static_cast<unsigned char>(c); }); |
| 131 | m.def("ord_char_lv", [](char &c) -> int { return static_cast<unsigned char>(c); }); |
| 132 | m.def("ord_char16", [](char16_t c) -> uint16_t { return c; }); |
nothing calls this directly
no test coverage detected