1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // <locale> 10 11 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS 12 13 // wstring_convert<Codecvt, Elem, Wide_alloc, Byte_alloc> 14 15 // byte_string to_bytes(Elem wchar); 16 // byte_string to_bytes(const Elem* wptr); 17 // byte_string to_bytes(const wide_string& wstr); 18 // byte_string to_bytes(const Elem* first, const Elem* last); 19 20 // XFAIL: no-wide-characters 21 22 #include <locale> 23 #include <codecvt> 24 #include <cassert> 25 26 #include "test_macros.h" 27 28 template <class CharT, size_t = sizeof(CharT)> 29 struct TestHelper; 30 template <class CharT> 31 struct TestHelper<CharT, 2> { 32 static void test(); 33 }; 34 template <class CharT> 35 struct TestHelper<CharT, 4> { 36 static void test(); 37 }; 38 39 template <class CharT> 40 void TestHelper<CharT, 2>::test() { 41 static_assert((std::is_same<CharT, wchar_t>::value), ""); 42 { 43 std::wstring_convert<std::codecvt_utf8<CharT> > myconv; 44 std::wstring ws(1, L'\u1005'); 45 std::string bs = myconv.to_bytes(ws[0]); 46 assert(bs == "\xE1\x80\x85"); 47 bs = myconv.to_bytes(ws.c_str()); 48 assert(bs == "\xE1\x80\x85"); 49 bs = myconv.to_bytes(ws); 50 assert(bs == "\xE1\x80\x85"); 51 bs = myconv.to_bytes(ws.data(), ws.data() + ws.size()); 52 assert(bs == "\xE1\x80\x85"); 53 bs = myconv.to_bytes(L""); 54 assert(bs.size() == 0); 55 } 56 } 57 58 template <class CharT> 59 void TestHelper<CharT, 4>::test() { 60 static_assert((std::is_same<CharT, wchar_t>::value), ""); 61 { 62 std::wstring_convert<std::codecvt_utf8<CharT> > myconv; 63 std::wstring ws(1, *L"\U00040003"); 64 std::string bs = myconv.to_bytes(ws[0]); 65 assert(bs == "\xF1\x80\x80\x83"); 66 bs = myconv.to_bytes(ws.c_str()); 67 assert(bs == "\xF1\x80\x80\x83"); 68 bs = myconv.to_bytes(ws); 69 assert(bs == "\xF1\x80\x80\x83"); 70 bs = myconv.to_bytes(ws.data(), ws.data() + ws.size()); 71 assert(bs == "\xF1\x80\x80\x83"); 72 bs = myconv.to_bytes(L""); 73 assert(bs.size() == 0); 74 } 75 } 76 77 int main(int, char**) { 78 TestHelper<wchar_t>::test(); 79 return 0; 80 } 81