Cleanup test issues reported by STL @ Microsoft.

This patch cleans up a number of issues reported by STL, including:

1) Fix duplicate is_convertible test.
2) Move non-standard reference_wrapper tests under test/libcxx
3) Fix assumption that sizeof(wchar_t) == 32 in the codecvt and
   wstring_convert tests.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@302870 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Fiselier
2017-05-12 03:38:28 +00:00
parent 050bf66723
commit e250cc68ce
10 changed files with 1230 additions and 1471 deletions

View File

@@ -25,14 +25,30 @@
#include <codecvt> #include <codecvt>
#include <cassert> #include <cassert>
int main() template <class CharT, size_t = sizeof(CharT)>
struct TestHelper;
template <class CharT>
struct TestHelper<CharT, 2> {
static void test();
};
template <class CharT>
struct TestHelper<CharT, 4> {
static void test();
};
template <class CharT>
void TestHelper<CharT, 2>::test() {
// Nothing to do, the conversion in unsupported
}
template <class CharT>
void TestHelper<CharT, 4>::test() {
{ {
{ typedef std::codecvt_utf16<CharT> C;
typedef std::codecvt_utf16<wchar_t> C;
C c; C c;
wchar_t w = 0x40003; CharT w = 0x40003;
char n[4] = {0}; char n[4] = {0};
const wchar_t* wp = nullptr; const CharT* wp = nullptr;
std::mbstate_t m; std::mbstate_t m;
char* np = nullptr; char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np); std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np);
@@ -75,11 +91,11 @@ int main()
assert(n[3] == char(0x03)); assert(n[3] == char(0x03));
} }
{ {
typedef std::codecvt_utf16<wchar_t, 0x1000> C; typedef std::codecvt_utf16<CharT, 0x1000> C;
C c; C c;
wchar_t w = 0x40003; CharT w = 0x40003;
char n[4] = {0}; char n[4] = {0};
const wchar_t* wp = nullptr; const CharT* wp = nullptr;
std::mbstate_t m; std::mbstate_t m;
char* np = nullptr; char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np); std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np);
@@ -122,11 +138,11 @@ int main()
assert(n[3] == char(0)); assert(n[3] == char(0));
} }
{ {
typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::generate_header> C; typedef std::codecvt_utf16<CharT, 0x10ffff, std::generate_header> C;
C c; C c;
wchar_t w = 0x40003; CharT w = 0x40003;
char n[6] = {0}; char n[6] = {0};
const wchar_t* wp = nullptr; const CharT* wp = nullptr;
std::mbstate_t m; std::mbstate_t m;
char* np = nullptr; char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 6, np); std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 6, np);
@@ -178,11 +194,11 @@ int main()
} }
{ {
typedef std::codecvt_utf16<wchar_t, 0x10FFFF, std::little_endian> C; typedef std::codecvt_utf16<CharT, 0x10FFFF, std::little_endian> C;
C c; C c;
wchar_t w = 0x40003; CharT w = 0x40003;
char n[4] = {0}; char n[4] = {0};
const wchar_t* wp = nullptr; const CharT* wp = nullptr;
std::mbstate_t m; std::mbstate_t m;
char* np = nullptr; char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np); std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np);
@@ -225,11 +241,11 @@ int main()
assert(n[2] == char(0x03)); assert(n[2] == char(0x03));
} }
{ {
typedef std::codecvt_utf16<wchar_t, 0x1000, std::little_endian> C; typedef std::codecvt_utf16<CharT, 0x1000, std::little_endian> C;
C c; C c;
wchar_t w = 0x40003; CharT w = 0x40003;
char n[4] = {0}; char n[4] = {0};
const wchar_t* wp = nullptr; const CharT* wp = nullptr;
std::mbstate_t m; std::mbstate_t m;
char* np = nullptr; char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np); std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np);
@@ -272,13 +288,14 @@ int main()
assert(n[2] == char(0)); assert(n[2] == char(0));
} }
{ {
typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::codecvt_mode( typedef std::codecvt_utf16<CharT, 0x10ffff,
std::generate_header | std::codecvt_mode(std::generate_header |
std::little_endian)> C; std::little_endian)>
C;
C c; C c;
wchar_t w = 0x40003; CharT w = 0x40003;
char n[6] = {0}; char n[6] = {0};
const wchar_t* wp = nullptr; const CharT* wp = nullptr;
std::mbstate_t m; std::mbstate_t m;
char* np = nullptr; char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 6, np); std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 6, np);
@@ -329,3 +346,8 @@ int main()
assert(n[4] == char(0x03)); assert(n[4] == char(0x03));
} }
} }
int main() {
TestHelper<char32_t>::test();
TestHelper<wchar_t>::test();
}

View File

@@ -25,14 +25,151 @@
#include <codecvt> #include <codecvt>
#include <cassert> #include <cassert>
int main() template <class CharT, size_t = sizeof(CharT)>
struct TestHelper;
template <class CharT>
struct TestHelper<CharT, 2> {
static void test();
};
template <class CharT>
struct TestHelper<CharT, 4> {
static void test();
};
template <class CharT>
void TestHelper<CharT, 2>::test() {
{ {
{ typedef std::codecvt_utf8<CharT> C;
typedef std::codecvt_utf8<wchar_t> C;
C c; C c;
wchar_t w = 0x40003; CharT w = 0x1005;
char n[4] = {0}; char n[4] = {0};
const wchar_t* wp = nullptr; const CharT* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w + 1);
assert(np == n + 3);
assert(n[0] == char(0xE1));
assert(n[1] == char(0x80));
assert(n[2] == char(0x85));
assert(n[3] == char(0));
w = 0x453;
r = c.out(m, &w, &w + 1, wp, n, n + 4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w + 1);
assert(np == n + 2);
assert(n[0] == char(0xD1));
assert(n[1] == char(0x93));
assert(n[2] == char(0x85));
assert(n[3] == char(0));
w = 0x56;
r = c.out(m, &w, &w + 1, wp, n, n + 4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w + 1);
assert(np == n + 1);
assert(n[0] == char(0x56));
assert(n[1] == char(0x93));
assert(n[2] == char(0x85));
assert(n[3] == char(0));
}
{
typedef std::codecvt_utf8<CharT, 0x1000> C;
C c;
CharT w = 0x1005;
char n[4] = {0};
const CharT* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np);
assert(r == std::codecvt_base::error);
assert(wp == &w);
assert(np == n);
assert(n[0] == char(0));
assert(n[1] == char(0));
assert(n[2] == char(0));
assert(n[3] == char(0));
w = 0x453;
r = c.out(m, &w, &w + 1, wp, n, n + 4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w + 1);
assert(np == n + 2);
assert(n[0] == char(0xD1));
assert(n[1] == char(0x93));
assert(n[2] == char(0));
assert(n[3] == char(0));
w = 0x56;
r = c.out(m, &w, &w + 1, wp, n, n + 4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w + 1);
assert(np == n + 1);
assert(n[0] == char(0x56));
assert(n[1] == char(0x93));
assert(n[2] == char(0));
assert(n[3] == char(0));
}
{
typedef std::codecvt_utf8<CharT, 0xFFFFFFFF, std::generate_header> C;
C c;
CharT w = 0x1005;
char n[7] = {0};
const CharT* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 7, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w + 1);
assert(np == n + 6);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xE1));
assert(n[4] == char(0x80));
assert(n[5] == char(0x85));
assert(n[6] == char(0));
w = 0x453;
r = c.out(m, &w, &w + 1, wp, n, n + 7, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w + 1);
assert(np == n + 5);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xD1));
assert(n[4] == char(0x93));
assert(n[5] == char(0x85));
assert(n[6] == char(0));
w = 0x56;
r = c.out(m, &w, &w + 1, wp, n, n + 7, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w + 1);
assert(np == n + 4);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0x56));
assert(n[4] == char(0x93));
assert(n[5] == char(0x85));
assert(n[6] == char(0));
}
}
template <class CharT>
void TestHelper<CharT, 4>::test() {
{
typedef std::codecvt_utf8<CharT> C;
C c;
CharT w = 0x40003;
char n[4] = {0};
const CharT* wp = nullptr;
std::mbstate_t m; std::mbstate_t m;
char* np = nullptr; char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np); std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np);
@@ -75,11 +212,11 @@ int main()
assert(n[3] == char(0x83)); assert(n[3] == char(0x83));
} }
{ {
typedef std::codecvt_utf8<wchar_t, 0x1000> C; typedef std::codecvt_utf8<CharT, 0x1000> C;
C c; C c;
wchar_t w = 0x40003; CharT w = 0x40003;
char n[4] = {0}; char n[4] = {0};
const wchar_t* wp = nullptr; const CharT* wp = nullptr;
std::mbstate_t m; std::mbstate_t m;
char* np = nullptr; char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np); std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 4, np);
@@ -122,11 +259,11 @@ int main()
assert(n[3] == char(0)); assert(n[3] == char(0));
} }
{ {
typedef std::codecvt_utf8<wchar_t, 0xFFFFFFFF, std::generate_header> C; typedef std::codecvt_utf8<CharT, 0xFFFFFFFF, std::generate_header> C;
C c; C c;
wchar_t w = 0x40003; CharT w = 0x40003;
char n[7] = {0}; char n[7] = {0};
const wchar_t* wp = nullptr; const CharT* wp = nullptr;
std::mbstate_t m; std::mbstate_t m;
char* np = nullptr; char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 7, np); std::codecvt_base::result r = c.out(m, &w, &w + 1, wp, n, n + 7, np);
@@ -180,277 +317,10 @@ int main()
assert(n[5] == char(0x85)); assert(n[5] == char(0x85));
assert(n[6] == char(0x83)); assert(n[6] == char(0x83));
} }
{
typedef std::codecvt_utf8<char32_t> C;
C c;
char32_t w = 0x40003;
char n[4] = {0};
const char32_t* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+4);
assert(n[0] == char(0xF1));
assert(n[1] == char(0x80));
assert(n[2] == char(0x80));
assert(n[3] == char(0x83));
w = 0x1005;
r = c.out(m, &w, &w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+3);
assert(n[0] == char(0xE1));
assert(n[1] == char(0x80));
assert(n[2] == char(0x85));
assert(n[3] == char(0x83));
w = 0x453;
r = c.out(m, &w, &w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+2);
assert(n[0] == char(0xD1));
assert(n[1] == char(0x93));
assert(n[2] == char(0x85));
assert(n[3] == char(0x83));
w = 0x56;
r = c.out(m, &w, &w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+1);
assert(n[0] == char(0x56));
assert(n[1] == char(0x93));
assert(n[2] == char(0x85));
assert(n[3] == char(0x83));
} }
{
typedef std::codecvt_utf8<char32_t, 0x1000> C;
C c;
char32_t w = 0x40003;
char n[4] = {0};
const char32_t* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::error);
assert(wp == &w);
assert(np == n);
assert(n[0] == char(0));
assert(n[1] == char(0));
assert(n[2] == char(0));
assert(n[3] == char(0));
w = 0x1005; int main() {
r = c.out(m, &w, &w+1, wp, n, n+4, np); TestHelper<wchar_t>::test();
assert(r == std::codecvt_base::error); TestHelper<char32_t>::test();
assert(wp == &w); TestHelper<char16_t>::test();
assert(np == n);
assert(n[0] == char(0));
assert(n[1] == char(0));
assert(n[2] == char(0));
assert(n[3] == char(0));
w = 0x453;
r = c.out(m, &w, &w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+2);
assert(n[0] == char(0xD1));
assert(n[1] == char(0x93));
assert(n[2] == char(0));
assert(n[3] == char(0));
w = 0x56;
r = c.out(m, &w, &w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+1);
assert(n[0] == char(0x56));
assert(n[1] == char(0x93));
assert(n[2] == char(0));
assert(n[3] == char(0));
}
{
typedef std::codecvt_utf8<char32_t, 0xFFFFFFFF, std::generate_header> C;
C c;
char32_t w = 0x40003;
char n[7] = {0};
const char32_t* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w+1, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+7);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xF1));
assert(n[4] == char(0x80));
assert(n[5] == char(0x80));
assert(n[6] == char(0x83));
w = 0x1005;
r = c.out(m, &w, &w+1, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+6);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xE1));
assert(n[4] == char(0x80));
assert(n[5] == char(0x85));
assert(n[6] == char(0x83));
w = 0x453;
r = c.out(m, &w, &w+1, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+5);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xD1));
assert(n[4] == char(0x93));
assert(n[5] == char(0x85));
assert(n[6] == char(0x83));
w = 0x56;
r = c.out(m, &w, &w+1, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+4);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0x56));
assert(n[4] == char(0x93));
assert(n[5] == char(0x85));
assert(n[6] == char(0x83));
}
{
typedef std::codecvt_utf8<char16_t> C;
C c;
char16_t w = 0x1005;
char n[4] = {0};
const char16_t* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+3);
assert(n[0] == char(0xE1));
assert(n[1] == char(0x80));
assert(n[2] == char(0x85));
assert(n[3] == char(0));
w = 0x453;
r = c.out(m, &w, &w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+2);
assert(n[0] == char(0xD1));
assert(n[1] == char(0x93));
assert(n[2] == char(0x85));
assert(n[3] == char(0));
w = 0x56;
r = c.out(m, &w, &w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+1);
assert(n[0] == char(0x56));
assert(n[1] == char(0x93));
assert(n[2] == char(0x85));
assert(n[3] == char(0));
}
{
typedef std::codecvt_utf8<char16_t, 0x1000> C;
C c;
char16_t w = 0x1005;
char n[4] = {0};
const char16_t* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::error);
assert(wp == &w);
assert(np == n);
assert(n[0] == char(0));
assert(n[1] == char(0));
assert(n[2] == char(0));
assert(n[3] == char(0));
w = 0x453;
r = c.out(m, &w, &w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+2);
assert(n[0] == char(0xD1));
assert(n[1] == char(0x93));
assert(n[2] == char(0));
assert(n[3] == char(0));
w = 0x56;
r = c.out(m, &w, &w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+1);
assert(n[0] == char(0x56));
assert(n[1] == char(0x93));
assert(n[2] == char(0));
assert(n[3] == char(0));
}
{
typedef std::codecvt_utf8<char16_t, 0xFFFFFFFF, std::generate_header> C;
C c;
char16_t w = 0x1005;
char n[7] = {0};
const char16_t* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, &w, &w+1, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+6);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xE1));
assert(n[4] == char(0x80));
assert(n[5] == char(0x85));
assert(n[6] == char(0));
w = 0x453;
r = c.out(m, &w, &w+1, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+5);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xD1));
assert(n[4] == char(0x93));
assert(n[5] == char(0x85));
assert(n[6] == char(0));
w = 0x56;
r = c.out(m, &w, &w+1, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == &w+1);
assert(np == n+4);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0x56));
assert(n[4] == char(0x93));
assert(n[5] == char(0x85));
assert(n[6] == char(0));
}
} }

View File

@@ -25,53 +25,25 @@
#include <codecvt> #include <codecvt>
#include <cassert> #include <cassert>
int main() template <class CharT, size_t = sizeof(CharT)>
struct TestHelper;
template <class CharT>
struct TestHelper<CharT, 2> {
static void test();
};
template <class CharT>
struct TestHelper<CharT, 4> {
static void test();
};
template <class CharT>
void TestHelper<CharT, 2>::test() {
{ {
{ typedef std::codecvt_utf8_utf16<CharT, 0x1000> C;
typedef std::codecvt_utf8_utf16<wchar_t> C;
C c; C c;
wchar_t w[2] = {0}; CharT w[2] = {0};
char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)}; char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
wchar_t* wp = nullptr; CharT* wp = nullptr;
std::mbstate_t m;
const char* np = nullptr;
std::codecvt_base::result r = c.in(m, n, n+4, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+2);
assert(np == n+4);
assert(w[0] == 0xD8C0);
assert(w[1] == 0xDC03);
n[0] = char(0xE1);
n[1] = char(0x80);
n[2] = char(0x85);
r = c.in(m, n, n+3, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+3);
assert(w[0] == 0x1005);
n[0] = char(0xD1);
n[1] = char(0x93);
r = c.in(m, n, n+2, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+2);
assert(w[0] == 0x0453);
n[0] = char(0x56);
r = c.in(m, n, n+1, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+1);
assert(w[0] == 0x0056);
}
{
typedef std::codecvt_utf8_utf16<wchar_t, 0x1000> C;
C c;
wchar_t w[2] = {0};
char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
wchar_t* wp = nullptr;
std::mbstate_t m; std::mbstate_t m;
const char* np = nullptr; const char* np = nullptr;
std::codecvt_base::result r = c.in(m, n, n + 4, np, w, w + 2, wp); std::codecvt_base::result r = c.in(m, n, n + 4, np, w, w + 2, wp);
@@ -103,239 +75,12 @@ int main()
assert(w[0] == 0x0056); assert(w[0] == 0x0056);
} }
{ {
typedef std::codecvt_utf8_utf16<wchar_t, 0x10ffff, std::consume_header> C; typedef std::codecvt_utf8_utf16<CharT, 0x10ffff, std::consume_header> C;
C c; C c;
wchar_t w[2] = {0}; CharT w[2] = {0};
char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)}; char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1),
wchar_t* wp = nullptr; char(0x80), char(0x80), char(0x83)};
std::mbstate_t m; CharT* wp = nullptr;
const char* np = nullptr;
std::codecvt_base::result r = c.in(m, n, n+7, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+2);
assert(np == n+7);
assert(w[0] == 0xD8C0);
assert(w[1] == 0xDC03);
n[0] = char(0xE1);
n[1] = char(0x80);
n[2] = char(0x85);
r = c.in(m, n, n+3, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+3);
assert(w[0] == 0x1005);
n[0] = char(0xD1);
n[1] = char(0x93);
r = c.in(m, n, n+2, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+2);
assert(w[0] == 0x0453);
n[0] = char(0x56);
r = c.in(m, n, n+1, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+1);
assert(w[0] == 0x0056);
}
{
typedef std::codecvt_utf8_utf16<char32_t> C;
C c;
char32_t w[2] = {0};
char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
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+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+2);
assert(np == n+4);
assert(w[0] == 0xD8C0);
assert(w[1] == 0xDC03);
n[0] = char(0xE1);
n[1] = char(0x80);
n[2] = char(0x85);
r = c.in(m, n, n+3, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+3);
assert(w[0] == 0x1005);
n[0] = char(0xD1);
n[1] = char(0x93);
r = c.in(m, n, n+2, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+2);
assert(w[0] == 0x0453);
n[0] = char(0x56);
r = c.in(m, n, n+1, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+1);
assert(w[0] == 0x0056);
}
{
typedef std::codecvt_utf8_utf16<char32_t, 0x1000> C;
C c;
char32_t w[2] = {0};
char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
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+2, wp);
assert(r == std::codecvt_base::error);
assert(wp == w);
assert(np == n);
n[0] = char(0xE1);
n[1] = char(0x80);
n[2] = char(0x85);
r = c.in(m, n, n+3, np, w, w+2, wp);
assert(r == std::codecvt_base::error);
assert(wp == w);
assert(np == n);
n[0] = char(0xD1);
n[1] = char(0x93);
r = c.in(m, n, n+2, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+2);
assert(w[0] == 0x0453);
n[0] = char(0x56);
r = c.in(m, n, n+1, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+1);
assert(w[0] == 0x0056);
}
{
typedef std::codecvt_utf8_utf16<char32_t, 0x10ffff, std::consume_header> C;
C c;
char32_t w[2] = {0};
char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
char32_t* wp = nullptr;
std::mbstate_t m;
const char* np = nullptr;
std::codecvt_base::result r = c.in(m, n, n+7, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+2);
assert(np == n+7);
assert(w[0] == 0xD8C0);
assert(w[1] == 0xDC03);
n[0] = char(0xE1);
n[1] = char(0x80);
n[2] = char(0x85);
r = c.in(m, n, n+3, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+3);
assert(w[0] == 0x1005);
n[0] = char(0xD1);
n[1] = char(0x93);
r = c.in(m, n, n+2, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+2);
assert(w[0] == 0x0453);
n[0] = char(0x56);
r = c.in(m, n, n+1, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+1);
assert(w[0] == 0x0056);
}
{
typedef std::codecvt_utf8_utf16<char16_t> C;
C c;
char16_t w[2] = {0};
char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
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+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+2);
assert(np == n+4);
assert(w[0] == 0xD8C0);
assert(w[1] == 0xDC03);
n[0] = char(0xE1);
n[1] = char(0x80);
n[2] = char(0x85);
r = c.in(m, n, n+3, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+3);
assert(w[0] == 0x1005);
n[0] = char(0xD1);
n[1] = char(0x93);
r = c.in(m, n, n+2, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+2);
assert(w[0] == 0x0453);
n[0] = char(0x56);
r = c.in(m, n, n+1, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+1);
assert(w[0] == 0x0056);
}
{
typedef std::codecvt_utf8_utf16<char16_t, 0x1000> C;
C c;
char16_t w[2] = {0};
char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
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+2, wp);
assert(r == std::codecvt_base::error);
assert(wp == w);
assert(np == n);
n[0] = char(0xE1);
n[1] = char(0x80);
n[2] = char(0x85);
r = c.in(m, n, n+3, np, w, w+2, wp);
assert(r == std::codecvt_base::error);
assert(wp == w);
assert(np == n);
n[0] = char(0xD1);
n[1] = char(0x93);
r = c.in(m, n, n+2, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+2);
assert(w[0] == 0x0453);
n[0] = char(0x56);
r = c.in(m, n, n+1, np, w, w+2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+1);
assert(w[0] == 0x0056);
}
{
typedef std::codecvt_utf8_utf16<char16_t, 0x10ffff, std::consume_header> C;
C c;
char16_t w[2] = {0};
char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
char16_t* wp = nullptr;
std::mbstate_t m; std::mbstate_t m;
const char* np = nullptr; const char* np = nullptr;
std::codecvt_base::result r = c.in(m, n, n + 7, np, w, w + 2, wp); std::codecvt_base::result r = c.in(m, n, n + 7, np, w, w + 2, wp);
@@ -370,3 +115,130 @@ int main()
assert(w[0] == 0x0056); assert(w[0] == 0x0056);
} }
} }
template <class CharT>
void TestHelper<CharT, 4>::test() {
{
typedef std::codecvt_utf8_utf16<CharT> C;
C c;
CharT w[2] = {0};
char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
CharT* wp = nullptr;
std::mbstate_t m;
const char* np = nullptr;
std::codecvt_base::result r = c.in(m, n, n + 4, np, w, w + 2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w + 2);
assert(np == n + 4);
assert(w[0] == 0xD8C0);
assert(w[1] == 0xDC03);
n[0] = char(0xE1);
n[1] = char(0x80);
n[2] = char(0x85);
r = c.in(m, n, n + 3, np, w, w + 2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 3);
assert(w[0] == 0x1005);
n[0] = char(0xD1);
n[1] = char(0x93);
r = c.in(m, n, n + 2, np, w, w + 2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 2);
assert(w[0] == 0x0453);
n[0] = char(0x56);
r = c.in(m, n, n + 1, np, w, w + 2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 1);
assert(w[0] == 0x0056);
}
{
typedef std::codecvt_utf8_utf16<CharT, 0x1000> C;
C c;
CharT w[2] = {0};
char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
CharT* wp = nullptr;
std::mbstate_t m;
const char* np = nullptr;
std::codecvt_base::result r = c.in(m, n, n + 4, np, w, w + 2, wp);
assert(r == std::codecvt_base::error);
assert(wp == w);
assert(np == n);
n[0] = char(0xE1);
n[1] = char(0x80);
n[2] = char(0x85);
r = c.in(m, n, n + 3, np, w, w + 2, wp);
assert(r == std::codecvt_base::error);
assert(wp == w);
assert(np == n);
n[0] = char(0xD1);
n[1] = char(0x93);
r = c.in(m, n, n + 2, np, w, w + 2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 2);
assert(w[0] == 0x0453);
n[0] = char(0x56);
r = c.in(m, n, n + 1, np, w, w + 2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 1);
assert(w[0] == 0x0056);
}
{
typedef std::codecvt_utf8_utf16<CharT, 0x10ffff, std::consume_header> C;
C c;
CharT w[2] = {0};
char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1),
char(0x80), char(0x80), char(0x83)};
CharT* wp = nullptr;
std::mbstate_t m;
const char* np = nullptr;
std::codecvt_base::result r = c.in(m, n, n + 7, np, w, w + 2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w + 2);
assert(np == n + 7);
assert(w[0] == 0xD8C0);
assert(w[1] == 0xDC03);
n[0] = char(0xE1);
n[1] = char(0x80);
n[2] = char(0x85);
r = c.in(m, n, n + 3, np, w, w + 2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 3);
assert(w[0] == 0x1005);
n[0] = char(0xD1);
n[1] = char(0x93);
r = c.in(m, n, n + 2, np, w, w + 2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 2);
assert(w[0] == 0x0453);
n[0] = char(0x56);
r = c.in(m, n, n + 1, np, w, w + 2, wp);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 1);
assert(w[0] == 0x0056);
}
}
int main() {
#ifndef _WIN32
TestHelper<wchar_t>::test();
#endif
TestHelper<char32_t>::test();
TestHelper<char16_t>::test();
}

View File

@@ -25,14 +25,25 @@
#include <codecvt> #include <codecvt>
#include <cassert> #include <cassert>
int main() template <class CharT, size_t = sizeof(CharT)>
struct TestHelper;
template <class CharT>
struct TestHelper<CharT, 2> {
static void test();
};
template <class CharT>
struct TestHelper<CharT, 4> {
static void test();
};
template <class CharT>
void TestHelper<CharT, 2>::test() {
{ {
{ typedef std::codecvt_utf8_utf16<CharT> C;
typedef std::codecvt_utf8_utf16<wchar_t> C;
C c; C c;
wchar_t w[2] = {0xD8C0, 0xDC03}; CharT w[2] = {0xD8C0, 0xDC03};
char n[4] = {0}; char n[4] = {0};
const wchar_t* wp = nullptr; const CharT* wp = nullptr;
std::mbstate_t m; std::mbstate_t m;
char* np = nullptr; char* np = nullptr;
std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 4, np); std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 4, np);
@@ -69,11 +80,11 @@ int main()
assert(n[0] == char(0x56)); assert(n[0] == char(0x56));
} }
{ {
typedef std::codecvt_utf8_utf16<wchar_t, 0x1000> C; typedef std::codecvt_utf8_utf16<CharT, 0x1000> C;
C c; C c;
wchar_t w[2] = {0xD8C0, 0xDC03}; CharT w[2] = {0xD8C0, 0xDC03};
char n[4] = {0}; char n[4] = {0};
const wchar_t* wp = nullptr; const CharT* wp = nullptr;
std::mbstate_t m; std::mbstate_t m;
char* np = nullptr; char* np = nullptr;
std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 4, np); std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 4, np);
@@ -103,268 +114,11 @@ int main()
assert(n[0] == char(0x56)); assert(n[0] == char(0x56));
} }
{ {
typedef std::codecvt_utf8_utf16<wchar_t, 0x10ffff, std::generate_header> C; typedef std::codecvt_utf8_utf16<CharT, 0x10ffff, std::generate_header> C;
C c; C c;
wchar_t w[2] = {0xD8C0, 0xDC03}; CharT w[2] = {0xD8C0, 0xDC03};
char n[7] = {0}; char n[7] = {0};
const wchar_t* wp = nullptr; const CharT* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+2);
assert(np == n+7);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xF1));
assert(n[4] == char(0x80));
assert(n[5] == char(0x80));
assert(n[6] == char(0x83));
w[0] = 0x1005;
r = c.out(m, w, w+1, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+6);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xE1));
assert(n[4] == char(0x80));
assert(n[5] == char(0x85));
w[0] = 0x453;
r = c.out(m, w, w+1, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+5);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xD1));
assert(n[4] == char(0x93));
w[0] = 0x56;
r = c.out(m, w, w+1, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+4);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0x56));
}
{
typedef std::codecvt_utf8_utf16<char32_t> C;
C c;
char32_t w[2] = {0xD8C0, 0xDC03};
char n[4] = {0};
const char32_t* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+2);
assert(np == n+4);
assert(n[0] == char(0xF1));
assert(n[1] == char(0x80));
assert(n[2] == char(0x80));
assert(n[3] == char(0x83));
w[0] = 0x1005;
r = c.out(m, w, w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+3);
assert(n[0] == char(0xE1));
assert(n[1] == char(0x80));
assert(n[2] == char(0x85));
w[0] = 0x453;
r = c.out(m, w, w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+2);
assert(n[0] == char(0xD1));
assert(n[1] == char(0x93));
w[0] = 0x56;
r = c.out(m, w, w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+1);
assert(n[0] == char(0x56));
}
{
typedef std::codecvt_utf8_utf16<char32_t, 0x1000> C;
C c;
char32_t w[2] = {0xD8C0, 0xDC03};
char n[4] = {0};
const char32_t* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+4, np);
assert(r == std::codecvt_base::error);
assert(wp == w);
assert(np == n);
w[0] = 0x1005;
r = c.out(m, w, w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::error);
assert(wp == w);
assert(np == n);
w[0] = 0x453;
r = c.out(m, w, w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+2);
assert(n[0] == char(0xD1));
assert(n[1] == char(0x93));
w[0] = 0x56;
r = c.out(m, w, w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+1);
assert(n[0] == char(0x56));
}
{
typedef std::codecvt_utf8_utf16<char32_t, 0x10ffff, std::generate_header> C;
C c;
char32_t w[2] = {0xD8C0, 0xDC03};
char n[7] = {0};
const char32_t* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+2);
assert(np == n+7);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xF1));
assert(n[4] == char(0x80));
assert(n[5] == char(0x80));
assert(n[6] == char(0x83));
w[0] = 0x1005;
r = c.out(m, w, w+1, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+6);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xE1));
assert(n[4] == char(0x80));
assert(n[5] == char(0x85));
w[0] = 0x453;
r = c.out(m, w, w+1, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+5);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xD1));
assert(n[4] == char(0x93));
w[0] = 0x56;
r = c.out(m, w, w+1, wp, n, n+7, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+4);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0x56));
}
{
typedef std::codecvt_utf8_utf16<char16_t> C;
C c;
char16_t w[2] = {0xD8C0, 0xDC03};
char n[4] = {0};
const char16_t* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+2);
assert(np == n+4);
assert(n[0] == char(0xF1));
assert(n[1] == char(0x80));
assert(n[2] == char(0x80));
assert(n[3] == char(0x83));
w[0] = 0x1005;
r = c.out(m, w, w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+3);
assert(n[0] == char(0xE1));
assert(n[1] == char(0x80));
assert(n[2] == char(0x85));
w[0] = 0x453;
r = c.out(m, w, w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+2);
assert(n[0] == char(0xD1));
assert(n[1] == char(0x93));
w[0] = 0x56;
r = c.out(m, w, w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+1);
assert(n[0] == char(0x56));
}
{
typedef std::codecvt_utf8_utf16<char16_t, 0x1000> C;
C c;
char16_t w[2] = {0xD8C0, 0xDC03};
char n[4] = {0};
const char16_t* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, w, w+2, wp, n, n+4, np);
assert(r == std::codecvt_base::error);
assert(wp == w);
assert(np == n);
w[0] = 0x1005;
r = c.out(m, w, w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::error);
assert(wp == w);
assert(np == n);
w[0] = 0x453;
r = c.out(m, w, w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+2);
assert(n[0] == char(0xD1));
assert(n[1] == char(0x93));
w[0] = 0x56;
r = c.out(m, w, w+1, wp, n, n+4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w+1);
assert(np == n+1);
assert(n[0] == char(0x56));
}
{
typedef std::codecvt_utf8_utf16<char16_t, 0x10ffff, std::generate_header> C;
C c;
char16_t w[2] = {0xD8C0, 0xDC03};
char n[7] = {0};
const char16_t* wp = nullptr;
std::mbstate_t m; std::mbstate_t m;
char* np = nullptr; char* np = nullptr;
std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 7, np); std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 7, np);
@@ -413,3 +167,143 @@ int main()
assert(n[3] == char(0x56)); assert(n[3] == char(0x56));
} }
} }
template <class CharT>
void TestHelper<CharT, 4>::test() {
{
typedef std::codecvt_utf8_utf16<CharT> C;
C c;
CharT w[2] = {0xD8C0, 0xDC03};
char n[4] = {0};
const CharT* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w + 2);
assert(np == n + 4);
assert(n[0] == char(0xF1));
assert(n[1] == char(0x80));
assert(n[2] == char(0x80));
assert(n[3] == char(0x83));
w[0] = 0x1005;
r = c.out(m, w, w + 1, wp, n, n + 4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 3);
assert(n[0] == char(0xE1));
assert(n[1] == char(0x80));
assert(n[2] == char(0x85));
w[0] = 0x453;
r = c.out(m, w, w + 1, wp, n, n + 4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 2);
assert(n[0] == char(0xD1));
assert(n[1] == char(0x93));
w[0] = 0x56;
r = c.out(m, w, w + 1, wp, n, n + 4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 1);
assert(n[0] == char(0x56));
}
{
typedef std::codecvt_utf8_utf16<CharT, 0x1000> C;
C c;
CharT w[2] = {0xD8C0, 0xDC03};
char n[4] = {0};
const CharT* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 4, np);
assert(r == std::codecvt_base::error);
assert(wp == w);
assert(np == n);
w[0] = 0x1005;
r = c.out(m, w, w + 1, wp, n, n + 4, np);
assert(r == std::codecvt_base::error);
assert(wp == w);
assert(np == n);
w[0] = 0x453;
r = c.out(m, w, w + 1, wp, n, n + 4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 2);
assert(n[0] == char(0xD1));
assert(n[1] == char(0x93));
w[0] = 0x56;
r = c.out(m, w, w + 1, wp, n, n + 4, np);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 1);
assert(n[0] == char(0x56));
}
{
typedef std::codecvt_utf8_utf16<CharT, 0x10ffff, std::generate_header> C;
C c;
CharT w[2] = {0xD8C0, 0xDC03};
char n[7] = {0};
const CharT* wp = nullptr;
std::mbstate_t m;
char* np = nullptr;
std::codecvt_base::result r = c.out(m, w, w + 2, wp, n, n + 7, np);
assert(r == std::codecvt_base::ok);
assert(wp == w + 2);
assert(np == n + 7);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xF1));
assert(n[4] == char(0x80));
assert(n[5] == char(0x80));
assert(n[6] == char(0x83));
w[0] = 0x1005;
r = c.out(m, w, w + 1, wp, n, n + 7, np);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 6);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xE1));
assert(n[4] == char(0x80));
assert(n[5] == char(0x85));
w[0] = 0x453;
r = c.out(m, w, w + 1, wp, n, n + 7, np);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 5);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0xD1));
assert(n[4] == char(0x93));
w[0] = 0x56;
r = c.out(m, w, w + 1, wp, n, n + 7, np);
assert(r == std::codecvt_base::ok);
assert(wp == w + 1);
assert(np == n + 4);
assert(n[0] == char(0xEF));
assert(n[1] == char(0xBB));
assert(n[2] == char(0xBF));
assert(n[3] == char(0x56));
}
}
int main() {
#ifndef _WIN32
TestHelper<wchar_t>::test();
#endif
TestHelper<char32_t>::test();
TestHelper<char16_t>::test();
}

View File

@@ -17,9 +17,39 @@
#include <codecvt> #include <codecvt>
#include <cassert> #include <cassert>
int main() template <class CharT, size_t = sizeof(CharT)>
struct TestHelper;
template <class CharT>
struct TestHelper<CharT, 2> {
static void test();
};
template <class CharT>
struct TestHelper<CharT, 4> {
static void test();
};
template <class CharT>
void TestHelper<CharT, 2>::test() {
static_assert(std::is_same<CharT, wchar_t>::value, "");
{ {
typedef std::codecvt_utf8<wchar_t> Codecvt; typedef std::codecvt_utf8<CharT> Codecvt;
typedef std::wstring_convert<Codecvt> Myconv;
Myconv myconv;
assert(myconv.converted() == 0);
std::string bs = myconv.to_bytes(L"\x1005");
assert(myconv.converted() == 1);
bs = myconv.to_bytes(L"\x1005\x65");
assert(myconv.converted() == 2);
std::wstring ws = myconv.from_bytes("\xE1\x80\x85");
assert(myconv.converted() == 3);
}
}
template <class CharT>
void TestHelper<CharT, 4>::test() {
static_assert(std::is_same<CharT, wchar_t>::value, "");
{
typedef std::codecvt_utf8<CharT> Codecvt;
typedef std::wstring_convert<Codecvt> Myconv; typedef std::wstring_convert<Codecvt> Myconv;
Myconv myconv; Myconv myconv;
assert(myconv.converted() == 0); assert(myconv.converted() == 0);
@@ -30,3 +60,6 @@ int main()
std::wstring ws = myconv.from_bytes("\xF1\x80\x80\x83"); std::wstring ws = myconv.from_bytes("\xF1\x80\x80\x83");
assert(myconv.converted() == 4); assert(myconv.converted() == 4);
} }
}
int main() { TestHelper<wchar_t>::test(); }

View File

@@ -20,10 +20,41 @@
#include <codecvt> #include <codecvt>
#include <cassert> #include <cassert>
int main() template <class CharT, size_t = sizeof(CharT)>
struct TestHelper;
template <class CharT>
struct TestHelper<CharT, 2> {
static void test();
};
template <class CharT>
struct TestHelper<CharT, 4> {
static void test();
};
template <class CharT>
void TestHelper<CharT, 2>::test() {
static_assert(std::is_same<CharT, wchar_t>::value, "");
{ {
std::wstring_convert<std::codecvt_utf8<CharT> > myconv;
std::string bs("\xE1\x80\x85\x00");
std::wstring ws = myconv.from_bytes('a');
assert(ws == L"a");
ws = myconv.from_bytes(bs.c_str());
assert(ws == L"\x1005");
ws = myconv.from_bytes(bs);
assert(ws == L"\x1005");
ws = myconv.from_bytes(bs.data(), bs.data() + bs.size());
assert(ws == L"\x1005");
ws = myconv.from_bytes("");
assert(ws.size() == 0);
}
}
template <class CharT>
void TestHelper<CharT, 4>::test() {
static_assert(std::is_same<CharT, wchar_t>::value, "");
{ {
std::wstring_convert<std::codecvt_utf8<wchar_t> > myconv; std::wstring_convert<std::codecvt_utf8<CharT> > myconv;
std::string bs("\xF1\x80\x80\x83"); std::string bs("\xF1\x80\x80\x83");
std::wstring ws = myconv.from_bytes('a'); std::wstring ws = myconv.from_bytes('a');
assert(ws == L"a"); assert(ws == L"a");
@@ -37,3 +68,5 @@ int main()
assert(ws.size() == 0); assert(ws.size() == 0);
} }
} }
int main() { TestHelper<wchar_t>::test(); }

View File

@@ -20,11 +20,42 @@
#include <codecvt> #include <codecvt>
#include <cassert> #include <cassert>
int main() template <class CharT, size_t = sizeof(CharT)>
struct TestHelper;
template <class CharT>
struct TestHelper<CharT, 2> {
static void test();
};
template <class CharT>
struct TestHelper<CharT, 4> {
static void test();
};
template <class CharT>
void TestHelper<CharT, 2>::test() {
static_assert(std::is_same<CharT, wchar_t>::value, "");
{ {
std::wstring_convert<std::codecvt_utf8<CharT> > myconv;
std::wstring ws(1, CharT(0x1005));
std::string bs = myconv.to_bytes(ws[0]);
assert(bs == "\xE1\x80\x85\x00");
bs = myconv.to_bytes(ws.c_str());
assert(bs == "\xE1\x80\x85\x00");
bs = myconv.to_bytes(ws);
assert(bs == "\xE1\x80\x85\x00");
bs = myconv.to_bytes(ws.data(), ws.data() + ws.size());
assert(bs == "\xE1\x80\x85\x00");
bs = myconv.to_bytes(L"");
assert(bs.size() == 0);
}
}
template <class CharT>
void TestHelper<CharT, 4>::test() {
static_assert(std::is_same<CharT, wchar_t>::value, "");
{ {
std::wstring_convert<std::codecvt_utf8<wchar_t> > myconv; std::wstring_convert<std::codecvt_utf8<CharT> > myconv;
std::wstring ws(1, L'\x40003'); std::wstring ws(1, CharT(0x40003));
std::string bs = myconv.to_bytes(ws[0]); std::string bs = myconv.to_bytes(ws[0]);
assert(bs == "\xF1\x80\x80\x83"); assert(bs == "\xF1\x80\x80\x83");
bs = myconv.to_bytes(ws.c_str()); bs = myconv.to_bytes(ws.c_str());
@@ -37,3 +68,5 @@ int main()
assert(bs.size() == 0); assert(bs.size() == 0);
} }
} }
int main() { TestHelper<wchar_t>::test(); }

View File

@@ -120,7 +120,9 @@ int main()
static_assert((!std::is_convertible<ConstFunction, Function>::value), ""); static_assert((!std::is_convertible<ConstFunction, Function>::value), "");
static_assert((!std::is_convertible<ConstFunction, Function*>::value), ""); static_assert((!std::is_convertible<ConstFunction, Function*>::value), "");
static_assert((!std::is_convertible<ConstFunction, Function&>::value), ""); static_assert((!std::is_convertible<ConstFunction, Function&>::value), "");
static_assert((!std::is_convertible<ConstFunction, Function>::value), ""); #if TEST_STD_VER >= 11
static_assert((!std::is_convertible<ConstFunction, Function&&>::value), "");
#endif
static_assert((!std::is_convertible<Function*, ConstFunction>::value), ""); static_assert((!std::is_convertible<Function*, ConstFunction>::value), "");
static_assert((!std::is_convertible<Function&, ConstFunction>::value), ""); static_assert((!std::is_convertible<Function&, ConstFunction>::value), "");
static_assert((!std::is_convertible<ConstFunction, ConstFunction>::value), ""); static_assert((!std::is_convertible<ConstFunction, ConstFunction>::value), "");