summaryrefslogtreecommitdiffstats
path: root/test/std/localization/locale.stdcvt/codecvt_utf16_in.pass.cpp
diff options
context:
space:
mode:
authorDan Albert <danalbert@google.com>2015-01-06 15:06:45 -0800
committerDan Albert <danalbert@google.com>2015-01-06 15:08:11 -0800
commit06086258d3d8c48a916ec51c33e1ad8f46821b81 (patch)
tree76eec05dd4f486c0aff58af92f9e216b3d6a32ef /test/std/localization/locale.stdcvt/codecvt_utf16_in.pass.cpp
parent4385cd8d939d12530f7e533d2c0846bb5732f681 (diff)
downloadexternal_libcxx-06086258d3d8c48a916ec51c33e1ad8f46821b81.tar.gz
external_libcxx-06086258d3d8c48a916ec51c33e1ad8f46821b81.tar.bz2
external_libcxx-06086258d3d8c48a916ec51c33e1ad8f46821b81.zip
Merge to upstream r225300.
Change-Id: I2b23715db9ac129ff80aa78ad5824db0a4d6fbb3
Diffstat (limited to 'test/std/localization/locale.stdcvt/codecvt_utf16_in.pass.cpp')
-rw-r--r--test/std/localization/locale.stdcvt/codecvt_utf16_in.pass.cpp739
1 files changed, 739 insertions, 0 deletions
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf16_in.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf16_in.pass.cpp
new file mode 100644
index 000000000..4d710c1a9
--- /dev/null
+++ b/test/std/localization/locale.stdcvt/codecvt_utf16_in.pass.cpp
@@ -0,0 +1,739 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <codecvt>
+
+// template <class Elem, unsigned long Maxcode = 0x10ffff,
+// codecvt_mode Mode = (codecvt_mode)0>
+// class codecvt_utf16
+// : public codecvt<Elem, char, mbstate_t>
+// {
+// // unspecified
+// };
+
+// result
+// in(stateT& state,
+// const externT* from, const externT* from_end, const externT*& from_next,
+// internT* to, internT* to_end, internT*& to_next) const;
+
+#include <codecvt>
+#include <cassert>
+
+int main()
+{
+ {
+ typedef std::codecvt_utf16<wchar_t> C;
+ C c;
+ wchar_t w = 0;
+ char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
+ wchar_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+4);
+ assert(w == 0x40003);
+
+ n[0] = char(0x10);
+ n[1] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x1005);
+
+ n[0] = char(0x04);
+ n[1] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[0] = char(0x00);
+ n[1] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<wchar_t, 0x1000> C;
+ C c;
+ wchar_t w = 0;
+ char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
+ wchar_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n);
+ assert(w == 0);
+
+ n[0] = char(0x10);
+ n[1] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n);
+ assert(w == 0);
+
+ n[0] = char(0x04);
+ n[1] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[0] = char(0x00);
+ n[1] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header> C;
+ C c;
+ wchar_t w = 0;
+ char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};
+ wchar_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+6);
+ assert(w == 0x40003);
+
+ n[0] = char(0x10);
+ n[1] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x1005);
+
+ n[0] = char(0x04);
+ n[1] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[0] = char(0x00);
+ n[1] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian> C;
+ C c;
+ wchar_t w = 0;
+ char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
+ wchar_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+4);
+ assert(w == 0x40003);
+
+ n[1] = char(0x10);
+ n[0] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x1005);
+
+ n[1] = char(0x04);
+ n[0] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[1] = char(0x00);
+ n[0] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<wchar_t, 0x1000, std::little_endian> C;
+ C c;
+ wchar_t w = 0;
+ char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
+ wchar_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n);
+ assert(w == 0);
+
+ n[1] = char(0x10);
+ n[0] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n);
+ assert(w == 0);
+
+ n[1] = char(0x04);
+ n[0] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[1] = char(0x00);
+ n[0] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::codecvt_mode(
+ std::consume_header |
+ std::little_endian)> C;
+ C c;
+ wchar_t w = 0;
+ char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};
+ wchar_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+6);
+ assert(w == 0x40003);
+
+ n[1] = char(0x10);
+ n[0] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x1005);
+
+ n[1] = char(0x04);
+ n[0] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[1] = char(0x00);
+ n[0] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<char32_t> C;
+ C c;
+ char32_t w = 0;
+ char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
+ char32_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+4);
+ assert(w == 0x40003);
+
+ n[0] = char(0x10);
+ n[1] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x1005);
+
+ n[0] = char(0x04);
+ n[1] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[0] = char(0x00);
+ n[1] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<char32_t, 0x1000> C;
+ C c;
+ char32_t w = 0;
+ char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
+ char32_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n);
+ assert(w == 0);
+
+ n[0] = char(0x10);
+ n[1] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n);
+ assert(w == 0);
+
+ n[0] = char(0x04);
+ n[1] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[0] = char(0x00);
+ n[1] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<char32_t, 0x10ffff, std::consume_header> C;
+ C c;
+ char32_t w = 0;
+ char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};
+ char32_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+6);
+ assert(w == 0x40003);
+
+ n[0] = char(0x10);
+ n[1] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x1005);
+
+ n[0] = char(0x04);
+ n[1] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[0] = char(0x00);
+ n[1] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<char32_t, 0x10ffff, std::little_endian> C;
+ C c;
+ char32_t w = 0;
+ char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
+ char32_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+4);
+ assert(w == 0x40003);
+
+ n[1] = char(0x10);
+ n[0] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x1005);
+
+ n[1] = char(0x04);
+ n[0] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[1] = char(0x00);
+ n[0] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<char32_t, 0x1000, std::little_endian> C;
+ C c;
+ char32_t w = 0;
+ char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
+ char32_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n);
+ assert(w == 0);
+
+ n[1] = char(0x10);
+ n[0] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n);
+ assert(w == 0);
+
+ n[1] = char(0x04);
+ n[0] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[1] = char(0x00);
+ n[0] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<char32_t, 0x10ffff, std::codecvt_mode(
+ std::consume_header |
+ std::little_endian)> C;
+ C c;
+ char32_t w = 0;
+ char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};
+ char32_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+6);
+ assert(w == 0x40003);
+
+ n[1] = char(0x10);
+ n[0] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x1005);
+
+ n[1] = char(0x04);
+ n[0] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[1] = char(0x00);
+ n[0] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+
+ {
+ typedef std::codecvt_utf16<char16_t> C;
+ C c;
+ char16_t w = 0;
+ char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
+ char16_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n);
+ assert(w == 0);
+
+ n[0] = char(0x10);
+ n[1] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x1005);
+
+ n[0] = char(0x04);
+ n[1] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[0] = char(0x00);
+ n[1] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<char16_t, 0x1000> C;
+ C c;
+ char16_t w = 0;
+ char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
+ char16_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n);
+ assert(w == 0);
+
+ n[0] = char(0x10);
+ n[1] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n);
+ assert(w == 0);
+
+ n[0] = char(0x04);
+ n[1] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[0] = char(0x00);
+ n[1] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<char16_t, 0x10ffff, std::consume_header> C;
+ C c;
+ char16_t w = 0;
+ char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};
+ char16_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n+2);
+ assert(w == 0);
+
+ n[0] = char(0x10);
+ n[1] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x1005);
+
+ n[0] = char(0x04);
+ n[1] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[0] = char(0x00);
+ n[1] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<char16_t, 0x10ffff, std::little_endian> C;
+ C c;
+ char16_t w = 0;
+ char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
+ char16_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n);
+ assert(w == 0);
+
+ n[1] = char(0x10);
+ n[0] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x1005);
+
+ n[1] = char(0x04);
+ n[0] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[1] = char(0x00);
+ n[0] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<char16_t, 0x1000, std::little_endian> C;
+ C c;
+ char16_t w = 0;
+ char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
+ char16_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+4, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n);
+ assert(w == 0);
+
+ n[1] = char(0x10);
+ n[0] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n);
+ assert(w == 0);
+
+ n[1] = char(0x04);
+ n[0] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[1] = char(0x00);
+ n[0] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+ {
+ typedef std::codecvt_utf16<char16_t, 0x10ffff, std::codecvt_mode(
+ std::consume_header |
+ std::little_endian)> C;
+ C c;
+ char16_t w = 0;
+ char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};
+ char16_t* wp = nullptr;
+ std::mbstate_t m;
+ const char* np = nullptr;
+ std::codecvt_base::result r = c.in(m, n, n+6, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::error);
+ assert(wp == &w);
+ assert(np == n+2);
+ assert(w == 0);
+
+ n[1] = char(0x10);
+ n[0] = char(0x05);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x1005);
+
+ n[1] = char(0x04);
+ n[0] = char(0x53);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x453);
+
+ w = 0x56;
+ n[1] = char(0x00);
+ n[0] = char(0x56);
+ r = c.in(m, n, n+2, np, &w, &w+1, wp);
+ assert(r == std::codecvt_base::ok);
+ assert(wp == &w+1);
+ assert(np == n+2);
+ assert(w == 0x56);
+ }
+}