// -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vim: set ts=2 et sw=2 tw=80:
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// You can obtain one at http://mozilla.org/MPL/2.0/.
#include "secport.h"
#include "gtest/gtest.h"
#include "prnetdb.h"
#include <stdint.h>
#include <string.h>
#include <string>
namespace nss_test {
// Structures to represent test cases. These are small enough that
// passing by value isn't a problem.
struct Ucs4Case {
PRUint32 c;
const char *utf8;
};
struct Ucs2Case {
PRUint16 c;
const char *utf8;
};
struct Utf16Case {
PRUint32 c;
PRUint16 w[
2 ];
};
struct Utf16BadCase {
PRUint16 w[
3 ];
};
// Test classes for parameterized tests:
class Ucs4Test :
public ::testing::TestWithParam<Ucs4Case> {};
class Ucs2Test :
public ::testing::TestWithParam<Ucs2Case> {};
class Utf16Test :
public ::testing::TestWithParam<Utf16Case> {};
class BadUtf8Test :
public ::testing::TestWithParam<
const char *> {};
class BadUtf16Test :
public ::testing::TestWithParam<Utf16BadCase> {};
class Iso88591Test :
public ::testing::TestWithParam<Ucs2Case> {};
// Tests of sec_port_ucs4_utf8_conversion_function, by itself, on
// valid inputs:
TEST_P(Ucs4Test, ToUtf8) {
const Ucs4Case testCase = GetParam();
PRUint32 nc = PR_htonl(testCase.c);
unsigned char utf8[
8 ] = {
0 };
unsigned int len =
0 ;
PRBool result = sec_port_ucs4_utf8_conversion_function(
PR_FALSE, (
unsigned char *)&nc,
sizeof (nc), utf8,
sizeof (utf8), &len);
ASSERT_TRUE(result);
ASSERT_LT(len,
sizeof (utf8));
EXPECT_EQ(std::string(testCase.utf8), std::string((
char *)utf8, len));
EXPECT_EQ(
'\0' , utf8[len]);
}
TEST_P(Ucs4Test, FromUtf8) {
const Ucs4Case testCase = GetParam();
PRUint32 nc;
unsigned int len =
0 ;
PRBool result = sec_port_ucs4_utf8_conversion_function(
PR_TRUE, (
unsigned char *)testCase.utf8, strlen(testCase.utf8),
(
unsigned char *)&nc,
sizeof (nc), &len);
ASSERT_TRUE(result);
ASSERT_EQ(
sizeof (nc), len);
EXPECT_EQ(testCase.c, PR_ntohl(nc));
}
TEST_P(Ucs4Test, DestTooSmall) {
const Ucs4Case testCase = GetParam();
PRUint32 nc = PR_htonl(testCase.c);
unsigned char utf8[
8 ];
unsigned char *utf8end = utf8 +
sizeof (utf8);
unsigned int len = strlen(testCase.utf8) -
1 ;
ASSERT_LE(len,
sizeof (utf8));
PRBool result = sec_port_ucs4_utf8_conversion_function(
PR_FALSE, (
unsigned char *)&nc,
sizeof (nc), utf8end - len, len, &len);
ASSERT_FALSE(result);
ASSERT_EQ(strlen(testCase.utf8), len);
}
// Tests of sec_port_ucs2_utf8_conversion_function, by itself, on
// valid inputs:
TEST_P(Ucs2Test, ToUtf8) {
const Ucs2Case testCase = GetParam();
PRUint16 nc = PR_htons(testCase.c);
unsigned char utf8[
8 ] = {
0 };
unsigned int len =
0 ;
PRBool result = sec_port_ucs2_utf8_conversion_function(
PR_FALSE, (
unsigned char *)&nc,
sizeof (nc), utf8,
sizeof (utf8), &len);
ASSERT_TRUE(result);
ASSERT_LT(len,
sizeof (utf8));
EXPECT_EQ(std::string(testCase.utf8), std::string((
char *)utf8, len));
EXPECT_EQ(
'\0' , utf8[len]);
}
TEST_P(Ucs2Test, FromUtf8) {
const Ucs2Case testCase = GetParam();
PRUint16 nc;
unsigned int len =
0 ;
PRBool result = sec_port_ucs2_utf8_conversion_function(
PR_TRUE, (
unsigned char *)testCase.utf8, strlen(testCase.utf8),
(
unsigned char *)&nc,
sizeof (nc), &len);
ASSERT_EQ(PR_TRUE, result);
ASSERT_EQ(
sizeof (nc), len);
EXPECT_EQ(testCase.c, PR_ntohs(nc));
}
TEST_P(Ucs2Test, DestTooSmall) {
const Ucs2Case testCase = GetParam();
PRUint16 nc = PR_htons(testCase.c);
unsigned char utf8[
8 ];
unsigned char *utf8end = utf8 +
sizeof (utf8);
unsigned int len = strlen(testCase.utf8) -
1 ;
ASSERT_LE(len,
sizeof (utf8));
PRBool result = sec_port_ucs2_utf8_conversion_function(
PR_FALSE, (
unsigned char *)&nc,
sizeof (nc), utf8end - len, len, &len);
ASSERT_EQ(result, PR_FALSE);
ASSERT_EQ(strlen(testCase.utf8), len);
}
// Tests using UTF-16 and UCS-4 conversion together:
TEST_P(Utf16Test, From16To32) {
const Utf16Case testCase = GetParam();
PRUint16 from[
2 ] = {PR_htons(testCase.w[
0 ]), PR_htons(testCase.w[
1 ])};
PRUint32 to;
unsigned char utf8[
8 ];
unsigned int len =
0 ;
PRBool result = sec_port_ucs2_utf8_conversion_function(
PR_FALSE, (
unsigned char *)&from,
sizeof (from), utf8,
sizeof (utf8), &len);
ASSERT_EQ(PR_TRUE, result);
result = sec_port_ucs4_utf8_conversion_function(
PR_TRUE, utf8, len, (
unsigned char *)&to,
sizeof (to), &len);
ASSERT_EQ(PR_TRUE, result);
ASSERT_EQ(
sizeof (to), len);
EXPECT_EQ(testCase.c, PR_ntohl(to));
}
TEST_P(Utf16Test, From32To16) {
const Utf16Case testCase = GetParam();
PRUint32 from = PR_htonl(testCase.c);
unsigned char utf8[
8 ];
unsigned int len =
0 ;
PRBool result = sec_port_ucs4_utf8_conversion_function(
PR_FALSE, (
unsigned char *)&from,
sizeof (from), utf8,
sizeof (utf8), &len);
ASSERT_EQ(PR_TRUE, result);
const std::string utf8copy((
char *)utf8, len);
PRUint16 to[
2 ];
result = sec_port_ucs2_utf8_conversion_function(
PR_TRUE, utf8, len, (
unsigned char *)&to,
sizeof (to), &len);
ASSERT_EQ(PR_TRUE, result);
ASSERT_EQ(
sizeof (to), len);
EXPECT_EQ(testCase.w[
0 ], PR_ntohs(to[
0 ]));
EXPECT_EQ(testCase.w[
1 ], PR_ntohs(to[
1 ]));
}
TEST_P(Utf16Test, SameUtf8) {
const Utf16Case testCase = GetParam();
PRUint32 from32 = PR_htonl(testCase.c);
unsigned char utf8from32[
8 ];
unsigned int lenFrom32 =
0 ;
PRBool result = sec_port_ucs4_utf8_conversion_function(
PR_FALSE, (
unsigned char *)&from32,
sizeof (from32), utf8from32,
sizeof (utf8from32), &lenFrom32);
ASSERT_TRUE(result);
ASSERT_LE(lenFrom32,
sizeof (utf8from32));
PRUint16 from16[
2 ] = {PR_htons(testCase.w[
0 ]), PR_htons(testCase.w[
1 ])};
unsigned char utf8from16[
8 ];
unsigned int lenFrom16 =
0 ;
result = sec_port_ucs2_utf8_conversion_function(
PR_FALSE, (
unsigned char *)&from16,
sizeof (from16), utf8from16,
sizeof (utf8from16), &lenFrom16);
ASSERT_TRUE(result);
ASSERT_LE(lenFrom16,
sizeof (utf8from16));
EXPECT_EQ(std::string((
char *)utf8from32, lenFrom32),
std::string((
char *)utf8from16, lenFrom16));
}
// Tests of invalid UTF-8 input:
TEST_P(BadUtf8Test, HasNoUcs2) {
const char *
const utf8 = GetParam();
unsigned char destBuf[
30 ];
unsigned int len =
0 ;
PRBool result = sec_port_ucs2_utf8_conversion_function(
PR_TRUE, (
unsigned char *)utf8, strlen(utf8), destBuf,
sizeof (destBuf),
&len);
EXPECT_FALSE(result);
}
TEST_P(BadUtf8Test, HasNoUcs4) {
const char *
const utf8 = GetParam();
unsigned char destBuf[
30 ];
unsigned int len =
0 ;
PRBool result = sec_port_ucs4_utf8_conversion_function(
PR_TRUE, (
unsigned char *)utf8, strlen(utf8), destBuf,
sizeof (destBuf),
&len);
EXPECT_FALSE(result);
}
// Tests of invalid UTF-16 input:
TEST_P(BadUtf16Test, HasNoUtf8) {
const Utf16BadCase testCase = GetParam();
Utf16BadCase srcBuf;
unsigned int len;
static const size_t maxLen = PR_ARRAY_SIZE(srcBuf.w);
size_t srcLen =
0 ;
while (testCase.w[srcLen] !=
0 ) {
srcBuf.w[srcLen] = PR_htons(testCase.w[srcLen]);
srcLen++;
ASSERT_LT(srcLen, maxLen);
}
unsigned char destBuf[
18 ];
PRBool result = sec_port_ucs2_utf8_conversion_function(
PR_FALSE, (
unsigned char *)srcBuf.w, srcLen *
sizeof (PRUint16), destBuf,
sizeof (destBuf), &len);
EXPECT_FALSE(result);
}
// Tests of sec_port_iso88591_utf8_conversion_function on valid inputs:
TEST_P(Iso88591Test, ToUtf8) {
const Ucs2Case testCase = GetParam();
unsigned char iso88591 = testCase.c;
unsigned char utf8[
3 ] = {
0 };
unsigned int len =
0 ;
ASSERT_EQ(testCase.c, (PRUint16)iso88591);
PRBool result = sec_port_iso88591_utf8_conversion_function(
&iso88591,
1 , utf8,
sizeof (utf8), &len);
ASSERT_TRUE(result);
ASSERT_LT(len,
sizeof (utf8));
EXPECT_EQ(std::string(testCase.utf8), std::string((
char *)utf8, len));
EXPECT_EQ(
0 U, utf8[len]);
}
// Tests for the various representations of NUL (which the above
// NUL-terminated test cases omitted):
TEST(Utf8Zeroes, From32To8) {
unsigned int len;
PRUint32 from =
0 ;
unsigned char to;
PRBool result = sec_port_ucs4_utf8_conversion_function(
PR_FALSE, (
unsigned char *)&from,
sizeof (from), &to,
sizeof (to), &len);
ASSERT_TRUE(result);
ASSERT_EQ(
sizeof (to), len);
EXPECT_EQ(
0 U, to);
}
TEST(Utf8Zeroes, From16To8) {
unsigned int len;
PRUint16 from =
0 ;
unsigned char to;
PRBool result = sec_port_ucs2_utf8_conversion_function(
PR_FALSE, (
unsigned char *)&from,
sizeof (from), &to,
sizeof (to), &len);
ASSERT_TRUE(result);
ASSERT_EQ(
sizeof (to), len);
EXPECT_EQ(
0 U, to);
}
TEST(Utf8Zeroes, From8To32) {
unsigned int len;
unsigned char from =
0 ;
PRUint32 to;
PRBool result = sec_port_ucs4_utf8_conversion_function(
PR_TRUE, &from,
sizeof (from), (
unsigned char *)&to,
sizeof (to), &len);
ASSERT_TRUE(result);
ASSERT_EQ(
sizeof (to), len);
EXPECT_EQ(
0 U, to);
}
TEST(Utf8Zeroes, From8To16) {
unsigned int len;
unsigned char from =
0 ;
PRUint16 to;
PRBool result = sec_port_ucs2_utf8_conversion_function(
PR_TRUE, &from,
sizeof (from), (
unsigned char *)&to,
sizeof (to), &len);
ASSERT_TRUE(result);
ASSERT_EQ(
sizeof (to), len);
EXPECT_EQ(
0 U, to);
}
// UCS-4 <-> UTF-8 cases
const Ucs4Case kUcs4Cases[] = {
{
0 x00000001,
"\x01" },
{
0 x00000002,
"\x02" },
{
0 x00000003,
"\x03" },
{
0 x00000004,
"\x04" },
{
0 x00000007,
"\x07" },
{
0 x00000008,
"\x08" },
{
0 x0000000F,
"\x0F" },
{
0 x00000010,
"\x10" },
{
0 x0000001F,
"\x1F" },
{
0 x00000020,
"\x20" },
{
0 x0000003F,
"\x3F" },
{
0 x00000040,
"\x40" },
{
0 x0000007F,
"\x7F" },
{
0 x00000080,
"\xC2\x80" },
{
0 x00000081,
"\xC2\x81" },
{
0 x00000082,
"\xC2\x82" },
{
0 x00000084,
"\xC2\x84" },
{
0 x00000088,
"\xC2\x88" },
{
0 x00000090,
"\xC2\x90" },
{
0 x000000A0,
"\xC2\xA0" },
{
0 x000000C0,
"\xC3\x80" },
{
0 x000000FF,
"\xC3\xBF" },
{
0 x00000100,
"\xC4\x80" },
{
0 x00000101,
"\xC4\x81" },
{
0 x00000102,
"\xC4\x82" },
{
0 x00000104,
"\xC4\x84" },
{
0 x00000108,
"\xC4\x88" },
{
0 x00000110,
"\xC4\x90" },
{
0 x00000120,
"\xC4\xA0" },
{
0 x00000140,
"\xC5\x80" },
{
0 x00000180,
"\xC6\x80" },
{
0 x000001FF,
"\xC7\xBF" },
{
0 x00000200,
"\xC8\x80" },
{
0 x00000201,
"\xC8\x81" },
{
0 x00000202,
"\xC8\x82" },
{
0 x00000204,
"\xC8\x84" },
{
0 x00000208,
"\xC8\x88" },
{
0 x00000210,
"\xC8\x90" },
{
0 x00000220,
"\xC8\xA0" },
{
0 x00000240,
"\xC9\x80" },
{
0 x00000280,
"\xCA\x80" },
{
0 x00000300,
"\xCC\x80" },
{
0 x000003FF,
"\xCF\xBF" },
{
0 x00000400,
"\xD0\x80" },
{
0 x00000401,
"\xD0\x81" },
{
0 x00000402,
"\xD0\x82" },
{
0 x00000404,
"\xD0\x84" },
{
0 x00000408,
"\xD0\x88" },
{
0 x00000410,
"\xD0\x90" },
{
0 x00000420,
"\xD0\xA0" },
{
0 x00000440,
"\xD1\x80" },
{
0 x00000480,
"\xD2\x80" },
{
0 x00000500,
"\xD4\x80" },
{
0 x00000600,
"\xD8\x80" },
{
0 x000007FF,
"\xDF\xBF" },
{
0 x00000800,
"\xE0\xA0\x80" },
{
0 x00000801,
"\xE0\xA0\x81" },
{
0 x00000802,
"\xE0\xA0\x82" },
{
0 x00000804,
"\xE0\xA0\x84" },
{
0 x00000808,
"\xE0\xA0\x88" },
{
0 x00000810,
"\xE0\xA0\x90" },
{
0 x00000820,
"\xE0\xA0\xA0" },
{
0 x00000840,
"\xE0\xA1\x80" },
{
0 x00000880,
"\xE0\xA2\x80" },
{
0 x00000900,
"\xE0\xA4\x80" },
{
0 x00000A00,
"\xE0\xA8\x80" },
{
0 x00000C00,
"\xE0\xB0\x80" },
{
0 x00000FFF,
"\xE0\xBF\xBF" },
{
0 x00001000,
"\xE1\x80\x80" },
{
0 x00001001,
"\xE1\x80\x81" },
{
0 x00001002,
"\xE1\x80\x82" },
{
0 x00001004,
"\xE1\x80\x84" },
{
0 x00001008,
"\xE1\x80\x88" },
{
0 x00001010,
"\xE1\x80\x90" },
{
0 x00001020,
"\xE1\x80\xA0" },
{
0 x00001040,
"\xE1\x81\x80" },
{
0 x00001080,
"\xE1\x82\x80" },
{
0 x00001100,
"\xE1\x84\x80" },
{
0 x00001200,
"\xE1\x88\x80" },
{
0 x00001400,
"\xE1\x90\x80" },
{
0 x00001800,
"\xE1\xA0\x80" },
{
0 x00001FFF,
"\xE1\xBF\xBF" },
{
0 x00002000,
"\xE2\x80\x80" },
{
0 x00002001,
"\xE2\x80\x81" },
{
0 x00002002,
"\xE2\x80\x82" },
{
0 x00002004,
"\xE2\x80\x84" },
{
0 x00002008,
"\xE2\x80\x88" },
{
0 x00002010,
"\xE2\x80\x90" },
{
0 x00002020,
"\xE2\x80\xA0" },
{
0 x00002040,
"\xE2\x81\x80" },
{
0 x00002080,
"\xE2\x82\x80" },
{
0 x00002100,
"\xE2\x84\x80" },
{
0 x00002200,
"\xE2\x88\x80" },
{
0 x00002400,
"\xE2\x90\x80" },
{
0 x00002800,
"\xE2\xA0\x80" },
{
0 x00003000,
"\xE3\x80\x80" },
{
0 x00003FFF,
"\xE3\xBF\xBF" },
{
0 x00004000,
"\xE4\x80\x80" },
{
0 x00004001,
"\xE4\x80\x81" },
{
0 x00004002,
"\xE4\x80\x82" },
{
0 x00004004,
"\xE4\x80\x84" },
{
0 x00004008,
"\xE4\x80\x88" },
{
0 x00004010,
"\xE4\x80\x90" },
{
0 x00004020,
"\xE4\x80\xA0" },
{
0 x00004040,
"\xE4\x81\x80" },
{
0 x00004080,
"\xE4\x82\x80" },
{
0 x00004100,
"\xE4\x84\x80" },
{
0 x00004200,
"\xE4\x88\x80" },
{
0 x00004400,
"\xE4\x90\x80" },
{
0 x00004800,
"\xE4\xA0\x80" },
{
0 x00005000,
"\xE5\x80\x80" },
{
0 x00006000,
"\xE6\x80\x80" },
{
0 x00007FFF,
"\xE7\xBF\xBF" },
{
0 x00008000,
"\xE8\x80\x80" },
{
0 x00008001,
"\xE8\x80\x81" },
{
0 x00008002,
"\xE8\x80\x82" },
{
0 x00008004,
"\xE8\x80\x84" },
{
0 x00008008,
"\xE8\x80\x88" },
{
0 x00008010,
"\xE8\x80\x90" },
{
0 x00008020,
"\xE8\x80\xA0" },
{
0 x00008040,
"\xE8\x81\x80" },
{
0 x00008080,
"\xE8\x82\x80" },
{
0 x00008100,
"\xE8\x84\x80" },
{
0 x00008200,
"\xE8\x88\x80" },
{
0 x00008400,
"\xE8\x90\x80" },
{
0 x00008800,
"\xE8\xA0\x80" },
{
0 x00009000,
"\xE9\x80\x80" },
{
0 x0000A000,
"\xEA\x80\x80" },
{
0 x0000C000,
"\xEC\x80\x80" },
{
0 x0000FFFF,
"\xEF\xBF\xBF" },
{
0 x00010000,
"\xF0\x90\x80\x80" },
{
0 x00010001,
"\xF0\x90\x80\x81" },
{
0 x00010002,
"\xF0\x90\x80\x82" },
{
0 x00010004,
"\xF0\x90\x80\x84" },
{
0 x00010008,
"\xF0\x90\x80\x88" },
{
0 x00010010,
"\xF0\x90\x80\x90" },
{
0 x00010020,
"\xF0\x90\x80\xA0" },
{
0 x00010040,
"\xF0\x90\x81\x80" },
{
0 x00010080,
"\xF0\x90\x82\x80" },
{
0 x00010100,
"\xF0\x90\x84\x80" },
{
0 x00010200,
"\xF0\x90\x88\x80" },
{
0 x00010400,
"\xF0\x90\x90\x80" },
{
0 x00010800,
"\xF0\x90\xA0\x80" },
{
0 x00011000,
"\xF0\x91\x80\x80" },
{
0 x00012000,
"\xF0\x92\x80\x80" },
{
0 x00014000,
"\xF0\x94\x80\x80" },
{
0 x00018000,
"\xF0\x98\x80\x80" },
{
0 x0001FFFF,
"\xF0\x9F\xBF\xBF" },
{
0 x00020000,
"\xF0\xA0\x80\x80" },
{
0 x00020001,
"\xF0\xA0\x80\x81" },
{
0 x00020002,
"\xF0\xA0\x80\x82" },
{
0 x00020004,
"\xF0\xA0\x80\x84" },
{
0 x00020008,
"\xF0\xA0\x80\x88" },
{
0 x00020010,
"\xF0\xA0\x80\x90" },
{
0 x00020020,
"\xF0\xA0\x80\xA0" },
{
0 x00020040,
"\xF0\xA0\x81\x80" },
{
0 x00020080,
"\xF0\xA0\x82\x80" },
{
0 x00020100,
"\xF0\xA0\x84\x80" },
{
0 x00020200,
"\xF0\xA0\x88\x80" },
{
0 x00020400,
"\xF0\xA0\x90\x80" },
{
0 x00020800,
"\xF0\xA0\xA0\x80" },
{
0 x00021000,
"\xF0\xA1\x80\x80" },
{
0 x00022000,
"\xF0\xA2\x80\x80" },
{
0 x00024000,
"\xF0\xA4\x80\x80" },
{
0 x00028000,
"\xF0\xA8\x80\x80" },
{
0 x00030000,
"\xF0\xB0\x80\x80" },
{
0 x0003FFFF,
"\xF0\xBF\xBF\xBF" },
{
0 x00040000,
"\xF1\x80\x80\x80" },
{
0 x00040001,
"\xF1\x80\x80\x81" },
{
0 x00040002,
"\xF1\x80\x80\x82" },
{
0 x00040004,
"\xF1\x80\x80\x84" },
{
0 x00040008,
"\xF1\x80\x80\x88" },
{
0 x00040010,
"\xF1\x80\x80\x90" },
{
0 x00040020,
"\xF1\x80\x80\xA0" },
{
0 x00040040,
"\xF1\x80\x81\x80" },
{
0 x00040080,
"\xF1\x80\x82\x80" },
{
0 x00040100,
"\xF1\x80\x84\x80" },
{
0 x00040200,
"\xF1\x80\x88\x80" },
{
0 x00040400,
"\xF1\x80\x90\x80" },
{
0 x00040800,
"\xF1\x80\xA0\x80" },
{
0 x00041000,
"\xF1\x81\x80\x80" },
{
0 x00042000,
"\xF1\x82\x80\x80" },
{
0 x00044000,
"\xF1\x84\x80\x80" },
{
0 x00048000,
"\xF1\x88\x80\x80" },
{
0 x00050000,
"\xF1\x90\x80\x80" },
{
0 x00060000,
"\xF1\xA0\x80\x80" },
{
0 x0007FFFF,
"\xF1\xBF\xBF\xBF" },
{
0 x00080000,
"\xF2\x80\x80\x80" },
{
0 x00080001,
"\xF2\x80\x80\x81" },
{
0 x00080002,
"\xF2\x80\x80\x82" },
{
0 x00080004,
"\xF2\x80\x80\x84" },
{
0 x00080008,
"\xF2\x80\x80\x88" },
{
0 x00080010,
"\xF2\x80\x80\x90" },
{
0 x00080020,
"\xF2\x80\x80\xA0" },
{
0 x00080040,
"\xF2\x80\x81\x80" },
{
0 x00080080,
"\xF2\x80\x82\x80" },
{
0 x00080100,
"\xF2\x80\x84\x80" },
{
0 x00080200,
"\xF2\x80\x88\x80" },
{
0 x00080400,
"\xF2\x80\x90\x80" },
{
0 x00080800,
"\xF2\x80\xA0\x80" },
{
0 x00081000,
"\xF2\x81\x80\x80" },
{
0 x00082000,
"\xF2\x82\x80\x80" },
{
0 x00084000,
"\xF2\x84\x80\x80" },
{
0 x00088000,
"\xF2\x88\x80\x80" },
{
0 x00090000,
"\xF2\x90\x80\x80" },
{
0 x000A0000,
"\xF2\xA0\x80\x80" },
{
0 x000C0000,
"\xF3\x80\x80\x80" },
{
0 x000FFFFF,
"\xF3\xBF\xBF\xBF" },
{
0 x00100000,
"\xF4\x80\x80\x80" },
{
0 x00100001,
"\xF4\x80\x80\x81" },
{
0 x00100002,
"\xF4\x80\x80\x82" },
{
0 x00100004,
"\xF4\x80\x80\x84" },
{
0 x00100008,
"\xF4\x80\x80\x88" },
{
0 x00100010,
"\xF4\x80\x80\x90" },
{
0 x00100020,
"\xF4\x80\x80\xA0" },
{
0 x00100040,
"\xF4\x80\x81\x80" },
{
0 x00100080,
"\xF4\x80\x82\x80" },
{
0 x00100100,
"\xF4\x80\x84\x80" },
{
0 x00100200,
"\xF4\x80\x88\x80" },
{
0 x00100400,
"\xF4\x80\x90\x80" },
{
0 x00100800,
"\xF4\x80\xA0\x80" },
{
0 x00101000,
"\xF4\x81\x80\x80" },
{
0 x00102000,
"\xF4\x82\x80\x80" },
{
0 x00104000,
"\xF4\x84\x80\x80" },
{
0 x00108000,
"\xF4\x88\x80\x80" },
{
0 x0010FFFF,
"\xF4\x8F\xBF\xBF" },
};
// UCS-2 <-> UTF-8 cases (divided into ISO-8859-1 vs. not).
const Ucs2Case kIso88591Cases[] = {
{
0 x0001,
"\x01" }, {
0 x0002,
"\x02" }, {
0 x0003,
"\x03" },
{
0 x0004,
"\x04" }, {
0 x0007,
"\x07" }, {
0 x0008,
"\x08" },
{
0 x000F,
"\x0F" }, {
0 x0010,
"\x10" }, {
0 x001F,
"\x1F" },
{
0 x0020,
"\x20" }, {
0 x003F,
"\x3F" }, {
0 x0040,
"\x40" },
{
0 x007F,
"\x7F" },
{
0 x0080,
"\xC2\x80" }, {
0 x0081,
"\xC2\x81" }, {
0 x0082,
"\xC2\x82" },
{
0 x0084,
"\xC2\x84" }, {
0 x0088,
"\xC2\x88" }, {
0 x0090,
"\xC2\x90" },
{
0 x00A0,
"\xC2\xA0" }, {
0 x00C0,
"\xC3\x80" }, {
0 x00FF,
"\xC3\xBF" },
};
const Ucs2Case kUcs2Cases[] = {
{
0 x0100,
"\xC4\x80" }, {
0 x0101,
"\xC4\x81" },
{
0 x0102,
"\xC4\x82" }, {
0 x0104,
"\xC4\x84" },
{
0 x0108,
"\xC4\x88" }, {
0 x0110,
"\xC4\x90" },
{
0 x0120,
"\xC4\xA0" }, {
0 x0140,
"\xC5\x80" },
{
0 x0180,
"\xC6\x80" }, {
0 x01FF,
"\xC7\xBF" },
{
0 x0200,
"\xC8\x80" }, {
0 x0201,
"\xC8\x81" },
{
0 x0202,
"\xC8\x82" }, {
0 x0204,
"\xC8\x84" },
{
0 x0208,
"\xC8\x88" }, {
0 x0210,
"\xC8\x90" },
{
0 x0220,
"\xC8\xA0" }, {
0 x0240,
"\xC9\x80" },
{
0 x0280,
"\xCA\x80" }, {
0 x0300,
"\xCC\x80" },
{
0 x03FF,
"\xCF\xBF" }, {
0 x0400,
"\xD0\x80" },
{
0 x0401,
"\xD0\x81" }, {
0 x0402,
"\xD0\x82" },
{
0 x0404,
"\xD0\x84" }, {
0 x0408,
"\xD0\x88" },
{
0 x0410,
"\xD0\x90" }, {
0 x0420,
"\xD0\xA0" },
{
0 x0440,
"\xD1\x80" }, {
0 x0480,
"\xD2\x80" },
{
0 x0500,
"\xD4\x80" }, {
0 x0600,
"\xD8\x80" },
{
0 x07FF,
"\xDF\xBF" },
{
0 x0800,
"\xE0\xA0\x80" }, {
0 x0801,
"\xE0\xA0\x81" },
{
0 x0802,
"\xE0\xA0\x82" }, {
0 x0804,
"\xE0\xA0\x84" },
{
0 x0808,
"\xE0\xA0\x88" }, {
0 x0810,
"\xE0\xA0\x90" },
{
0 x0820,
"\xE0\xA0\xA0" }, {
0 x0840,
"\xE0\xA1\x80" },
{
0 x0880,
"\xE0\xA2\x80" }, {
0 x0900,
"\xE0\xA4\x80" },
{
0 x0A00,
"\xE0\xA8\x80" }, {
0 x0C00,
"\xE0\xB0\x80" },
{
0 x0FFF,
"\xE0\xBF\xBF" }, {
0 x1000,
"\xE1\x80\x80" },
{
0 x1001,
"\xE1\x80\x81" }, {
0 x1002,
"\xE1\x80\x82" },
{
0 x1004,
"\xE1\x80\x84" }, {
0 x1008,
"\xE1\x80\x88" },
{
0 x1010,
"\xE1\x80\x90" }, {
0 x1020,
"\xE1\x80\xA0" },
{
0 x1040,
"\xE1\x81\x80" }, {
0 x1080,
"\xE1\x82\x80" },
{
0 x1100,
"\xE1\x84\x80" }, {
0 x1200,
"\xE1\x88\x80" },
{
0 x1400,
"\xE1\x90\x80" }, {
0 x1800,
"\xE1\xA0\x80" },
{
0 x1FFF,
"\xE1\xBF\xBF" }, {
0 x2000,
"\xE2\x80\x80" },
{
0 x2001,
"\xE2\x80\x81" }, {
0 x2002,
"\xE2\x80\x82" },
{
0 x2004,
"\xE2\x80\x84" }, {
0 x2008,
"\xE2\x80\x88" },
{
0 x2010,
"\xE2\x80\x90" }, {
0 x2020,
"\xE2\x80\xA0" },
{
0 x2040,
"\xE2\x81\x80" }, {
0 x2080,
"\xE2\x82\x80" },
{
0 x2100,
"\xE2\x84\x80" }, {
0 x2200,
"\xE2\x88\x80" },
{
0 x2400,
"\xE2\x90\x80" }, {
0 x2800,
"\xE2\xA0\x80" },
{
0 x3000,
"\xE3\x80\x80" }, {
0 x3FFF,
"\xE3\xBF\xBF" },
{
0 x4000,
"\xE4\x80\x80" }, {
0 x4001,
"\xE4\x80\x81" },
{
0 x4002,
"\xE4\x80\x82" }, {
0 x4004,
"\xE4\x80\x84" },
{
0 x4008,
"\xE4\x80\x88" }, {
0 x4010,
"\xE4\x80\x90" },
{
0 x4020,
"\xE4\x80\xA0" }, {
0 x4040,
"\xE4\x81\x80" },
{
0 x4080,
"\xE4\x82\x80" }, {
0 x4100,
"\xE4\x84\x80" },
{
0 x4200,
"\xE4\x88\x80" }, {
0 x4400,
"\xE4\x90\x80" },
{
0 x4800,
"\xE4\xA0\x80" }, {
0 x5000,
"\xE5\x80\x80" },
{
0 x6000,
"\xE6\x80\x80" }, {
0 x7FFF,
"\xE7\xBF\xBF" },
{
0 x8000,
"\xE8\x80\x80" }, {
0 x8001,
"\xE8\x80\x81" },
{
0 x8002,
"\xE8\x80\x82" }, {
0 x8004,
"\xE8\x80\x84" },
{
0 x8008,
"\xE8\x80\x88" }, {
0 x8010,
"\xE8\x80\x90" },
{
0 x8020,
"\xE8\x80\xA0" }, {
0 x8040,
"\xE8\x81\x80" },
{
0 x8080,
"\xE8\x82\x80" }, {
0 x8100,
"\xE8\x84\x80" },
{
0 x8200,
"\xE8\x88\x80" }, {
0 x8400,
"\xE8\x90\x80" },
{
0 x8800,
"\xE8\xA0\x80" }, {
0 x9000,
"\xE9\x80\x80" },
{
0 xA000,
"\xEA\x80\x80" }, {
0 xC000,
"\xEC\x80\x80" },
{
0 xFB01,
"\xEF\xAC\x81" }, {
0 xFFFF,
"\xEF\xBF\xBF" }};
// UTF-16 <-> UCS-4 cases
const Utf16Case kUtf16Cases[] = {{
0 x00010000, {
0 xD800,
0 xDC00}},
{
0 x00010001, {
0 xD800,
0 xDC01}},
{
0 x00010002, {
0 xD800,
0 xDC02}},
{
0 x00010003, {
0 xD800,
0 xDC03}},
{
0 x00010004, {
0 xD800,
0 xDC04}},
{
0 x00010007, {
0 xD800,
0 xDC07}},
{
0 x00010008, {
0 xD800,
0 xDC08}},
{
0 x0001000F, {
0 xD800,
0 xDC0F}},
{
0 x00010010, {
0 xD800,
0 xDC10}},
{
0 x0001001F, {
0 xD800,
0 xDC1F}},
{
0 x00010020, {
0 xD800,
0 xDC20}},
{
0 x0001003F, {
0 xD800,
0 xDC3F}},
{
0 x00010040, {
0 xD800,
0 xDC40}},
{
0 x0001007F, {
0 xD800,
0 xDC7F}},
{
0 x00010080, {
0 xD800,
0 xDC80}},
{
0 x00010081, {
0 xD800,
0 xDC81}},
{
0 x00010082, {
0 xD800,
0 xDC82}},
{
0 x00010084, {
0 xD800,
0 xDC84}},
{
0 x00010088, {
0 xD800,
0 xDC88}},
{
0 x00010090, {
0 xD800,
0 xDC90}},
{
0 x000100A0, {
0 xD800,
0 xDCA0}},
{
0 x000100C0, {
0 xD800,
0 xDCC0}},
{
0 x000100FF, {
0 xD800,
0 xDCFF}},
{
0 x00010100, {
0 xD800,
0 xDD00}},
{
0 x00010101, {
0 xD800,
0 xDD01}},
{
0 x00010102, {
0 xD800,
0 xDD02}},
{
0 x00010104, {
0 xD800,
0 xDD04}},
{
0 x00010108, {
0 xD800,
0 xDD08}},
{
0 x00010110, {
0 xD800,
0 xDD10}},
{
0 x00010120, {
0 xD800,
0 xDD20}},
{
0 x00010140, {
0 xD800,
0 xDD40}},
{
0 x00010180, {
0 xD800,
0 xDD80}},
{
0 x000101FF, {
0 xD800,
0 xDDFF}},
{
0 x00010200, {
0 xD800,
0 xDE00}},
{
0 x00010201, {
0 xD800,
0 xDE01}},
{
0 x00010202, {
0 xD800,
0 xDE02}},
{
0 x00010204, {
0 xD800,
0 xDE04}},
{
0 x00010208, {
0 xD800,
0 xDE08}},
{
0 x00010210, {
0 xD800,
0 xDE10}},
{
0 x00010220, {
0 xD800,
0 xDE20}},
{
0 x00010240, {
0 xD800,
0 xDE40}},
{
0 x00010280, {
0 xD800,
0 xDE80}},
{
0 x00010300, {
0 xD800,
0 xDF00}},
{
0 x000103FF, {
0 xD800,
0 xDFFF}},
{
0 x00010400, {
0 xD801,
0 xDC00}},
{
0 x00010401, {
0 xD801,
0 xDC01}},
{
0 x00010402, {
0 xD801,
0 xDC02}},
{
0 x00010404, {
0 xD801,
0 xDC04}},
{
0 x00010408, {
0 xD801,
0 xDC08}},
{
0 x00010410, {
0 xD801,
0 xDC10}},
{
0 x00010420, {
0 xD801,
0 xDC20}},
{
0 x00010440, {
0 xD801,
0 xDC40}},
{
0 x00010480, {
0 xD801,
0 xDC80}},
{
0 x00010500, {
0 xD801,
0 xDD00}},
{
0 x00010600, {
0 xD801,
0 xDE00}},
{
0 x000107FF, {
0 xD801,
0 xDFFF}},
{
0 x00010800, {
0 xD802,
0 xDC00}},
{
0 x00010801, {
0 xD802,
0 xDC01}},
{
0 x00010802, {
0 xD802,
0 xDC02}},
{
0 x00010804, {
0 xD802,
0 xDC04}},
{
0 x00010808, {
0 xD802,
0 xDC08}},
{
0 x00010810, {
0 xD802,
0 xDC10}},
{
0 x00010820, {
0 xD802,
0 xDC20}},
{
0 x00010840, {
0 xD802,
0 xDC40}},
{
0 x00010880, {
0 xD802,
0 xDC80}},
{
0 x00010900, {
0 xD802,
0 xDD00}},
{
0 x00010A00, {
0 xD802,
0 xDE00}},
{
0 x00010C00, {
0 xD803,
0 xDC00}},
{
0 x00010FFF, {
0 xD803,
0 xDFFF}},
{
0 x00011000, {
0 xD804,
0 xDC00}},
{
0 x00011001, {
0 xD804,
0 xDC01}},
{
0 x00011002, {
0 xD804,
0 xDC02}},
{
0 x00011004, {
0 xD804,
0 xDC04}},
{
0 x00011008, {
0 xD804,
0 xDC08}},
{
0 x00011010, {
0 xD804,
0 xDC10}},
{
0 x00011020, {
0 xD804,
0 xDC20}},
{
0 x00011040, {
0 xD804,
0 xDC40}},
{
0 x00011080, {
0 xD804,
0 xDC80}},
{
0 x00011100, {
0 xD804,
0 xDD00}},
{
0 x00011200, {
0 xD804,
0 xDE00}},
{
0 x00011400, {
0 xD805,
0 xDC00}},
{
0 x00011800, {
0 xD806,
0 xDC00}},
{
0 x00011FFF, {
0 xD807,
0 xDFFF}},
{
0 x00012000, {
0 xD808,
0 xDC00}},
{
0 x00012001, {
0 xD808,
0 xDC01}},
{
0 x00012002, {
0 xD808,
0 xDC02}},
{
0 x00012004, {
0 xD808,
0 xDC04}},
{
0 x00012008, {
0 xD808,
0 xDC08}},
{
0 x00012010, {
0 xD808,
0 xDC10}},
{
0 x00012020, {
0 xD808,
0 xDC20}},
{
0 x00012040, {
0 xD808,
0 xDC40}},
{
0 x00012080, {
0 xD808,
0 xDC80}},
{
0 x00012100, {
0 xD808,
0 xDD00}},
{
0 x00012200, {
0 xD808,
0 xDE00}},
{
0 x00012400, {
0 xD809,
0 xDC00}},
{
0 x00012800, {
0 xD80A,
0 xDC00}},
{
0 x00013000, {
0 xD80C,
0 xDC00}},
{
0 x00013FFF, {
0 xD80F,
0 xDFFF}},
{
0 x00014000, {
0 xD810,
0 xDC00}},
{
0 x00014001, {
0 xD810,
0 xDC01}},
{
0 x00014002, {
0 xD810,
0 xDC02}},
{
0 x00014004, {
0 xD810,
0 xDC04}},
{
0 x00014008, {
0 xD810,
0 xDC08}},
{
0 x00014010, {
0 xD810,
0 xDC10}},
{
0 x00014020, {
0 xD810,
0 xDC20}},
{
0 x00014040, {
0 xD810,
0 xDC40}},
{
0 x00014080, {
0 xD810,
0 xDC80}},
{
0 x00014100, {
0 xD810,
0 xDD00}},
{
0 x00014200, {
0 xD810,
0 xDE00}},
{
0 x00014400, {
0 xD811,
0 xDC00}},
{
0 x00014800, {
0 xD812,
0 xDC00}},
{
0 x00015000, {
0 xD814,
0 xDC00}},
{
0 x00016000, {
0 xD818,
0 xDC00}},
{
0 x00017FFF, {
0 xD81F,
0 xDFFF}},
{
0 x00018000, {
0 xD820,
0 xDC00}},
{
0 x00018001, {
0 xD820,
0 xDC01}},
{
0 x00018002, {
0 xD820,
0 xDC02}},
{
0 x00018004, {
0 xD820,
0 xDC04}},
{
0 x00018008, {
0 xD820,
0 xDC08}},
{
0 x00018010, {
0 xD820,
0 xDC10}},
{
0 x00018020, {
0 xD820,
0 xDC20}},
{
0 x00018040, {
0 xD820,
0 xDC40}},
{
0 x00018080, {
0 xD820,
0 xDC80}},
{
0 x00018100, {
0 xD820,
0 xDD00}},
{
0 x00018200, {
0 xD820,
0 xDE00}},
{
0 x00018400, {
0 xD821,
0 xDC00}},
{
0 x00018800, {
0 xD822,
0 xDC00}},
{
0 x00019000, {
0 xD824,
0 xDC00}},
{
0 x0001A000, {
0 xD828,
0 xDC00}},
{
0 x0001C000, {
0 xD830,
0 xDC00}},
{
0 x0001FFFF, {
0 xD83F,
0 xDFFF}},
{
0 x00020000, {
0 xD840,
0 xDC00}},
{
0 x00020001, {
0 xD840,
0 xDC01}},
{
0 x00020002, {
0 xD840,
0 xDC02}},
{
0 x00020004, {
0 xD840,
0 xDC04}},
{
0 x00020008, {
0 xD840,
0 xDC08}},
{
0 x00020010, {
0 xD840,
0 xDC10}},
{
0 x00020020, {
0 xD840,
0 xDC20}},
{
0 x00020040, {
0 xD840,
0 xDC40}},
{
0 x00020080, {
0 xD840,
0 xDC80}},
{
0 x00020100, {
0 xD840,
0 xDD00}},
{
0 x00020200, {
0 xD840,
0 xDE00}},
{
0 x00020400, {
0 xD841,
0 xDC00}},
{
0 x00020800, {
0 xD842,
0 xDC00}},
{
0 x00021000, {
0 xD844,
0 xDC00}},
{
0 x00022000, {
0 xD848,
0 xDC00}},
{
0 x00024000, {
0 xD850,
0 xDC00}},
{
0 x00028000, {
0 xD860,
0 xDC00}},
{
0 x0002FFFF, {
0 xD87F,
0 xDFFF}},
{
0 x00030000, {
0 xD880,
0 xDC00}},
{
0 x00030001, {
0 xD880,
0 xDC01}},
{
0 x00030002, {
0 xD880,
0 xDC02}},
{
0 x00030004, {
0 xD880,
0 xDC04}},
{
0 x00030008, {
0 xD880,
0 xDC08}},
{
0 x00030010, {
0 xD880,
0 xDC10}},
{
0 x00030020, {
0 xD880,
0 xDC20}},
{
0 x00030040, {
0 xD880,
0 xDC40}},
{
0 x00030080, {
0 xD880,
0 xDC80}},
{
0 x00030100, {
0 xD880,
0 xDD00}},
{
0 x00030200, {
0 xD880,
0 xDE00}},
{
0 x00030400, {
0 xD881,
0 xDC00}},
{
0 x00030800, {
0 xD882,
0 xDC00}},
{
0 x00031000, {
0 xD884,
0 xDC00}},
{
0 x00032000, {
0 xD888,
0 xDC00}},
{
0 x00034000, {
0 xD890,
0 xDC00}},
{
0 x00038000, {
0 xD8A0,
0 xDC00}},
{
0 x0003FFFF, {
0 xD8BF,
0 xDFFF}},
{
0 x00040000, {
0 xD8C0,
0 xDC00}},
{
0 x00040001, {
0 xD8C0,
0 xDC01}},
{
0 x00040002, {
0 xD8C0,
0 xDC02}},
{
0 x00040004, {
0 xD8C0,
0 xDC04}},
{
0 x00040008, {
0 xD8C0,
0 xDC08}},
{
0 x00040010, {
0 xD8C0,
0 xDC10}},
{
0 x00040020, {
0 xD8C0,
0 xDC20}},
{
0 x00040040, {
0 xD8C0,
0 xDC40}},
{
0 x00040080, {
0 xD8C0,
0 xDC80}},
{
0 x00040100, {
0 xD8C0,
0 xDD00}},
{
0 x00040200, {
0 xD8C0,
0 xDE00}},
{
0 x00040400, {
0 xD8C1,
0 xDC00}},
{
0 x00040800, {
0 xD8C2,
0 xDC00}},
{
0 x00041000, {
0 xD8C4,
0 xDC00}},
{
0 x00042000, {
0 xD8C8,
0 xDC00}},
{
0 x00044000, {
0 xD8D0,
0 xDC00}},
{
0 x00048000, {
0 xD8E0,
0 xDC00}},
{
0 x0004FFFF, {
0 xD8FF,
0 xDFFF}},
{
0 x00050000, {
0 xD900,
0 xDC00}},
{
0 x00050001, {
0 xD900,
0 xDC01}},
{
0 x00050002, {
0 xD900,
0 xDC02}},
{
0 x00050004, {
0 xD900,
0 xDC04}},
{
0 x00050008, {
0 xD900,
0 xDC08}},
{
0 x00050010, {
0 xD900,
0 xDC10}},
{
0 x00050020, {
0 xD900,
0 xDC20}},
{
0 x00050040, {
0 xD900,
0 xDC40}},
{
0 x00050080, {
0 xD900,
0 xDC80}},
{
0 x00050100, {
0 xD900,
0 xDD00}},
{
0 x00050200, {
0 xD900,
0 xDE00}},
{
0 x00050400, {
0 xD901,
0 xDC00}},
{
0 x00050800, {
0 xD902,
0 xDC00}},
{
0 x00051000, {
0 xD904,
0 xDC00}},
{
0 x00052000, {
0 xD908,
0 xDC00}},
{
0 x00054000, {
0 xD910,
0 xDC00}},
{
0 x00058000, {
0 xD920,
0 xDC00}},
{
0 x00060000, {
0 xD940,
0 xDC00}},
{
0 x00070000, {
0 xD980,
0 xDC00}},
{
0 x0007FFFF, {
0 xD9BF,
0 xDFFF}},
{
0 x00080000, {
0 xD9C0,
0 xDC00}},
{
0 x00080001, {
0 xD9C0,
0 xDC01}},
{
0 x00080002, {
0 xD9C0,
0 xDC02}},
{
0 x00080004, {
0 xD9C0,
0 xDC04}},
{
0 x00080008, {
0 xD9C0,
0 xDC08}},
{
0 x00080010, {
0 xD9C0,
0 xDC10}},
{
0 x00080020, {
0 xD9C0,
0 xDC20}},
{
0 x00080040, {
0 xD9C0,
0 xDC40}},
{
0 x00080080, {
0 xD9C0,
0 xDC80}},
{
0 x00080100, {
0 xD9C0,
0 xDD00}},
{
0 x00080200, {
0 xD9C0,
0 xDE00}},
{
0 x00080400, {
0 xD9C1,
0 xDC00}},
{
0 x00080800, {
0 xD9C2,
0 xDC00}},
{
0 x00081000, {
0 xD9C4,
0 xDC00}},
{
0 x00082000, {
0 xD9C8,
0 xDC00}},
{
0 x00084000, {
0 xD9D0,
0 xDC00}},
{
0 x00088000, {
0 xD9E0,
0 xDC00}},
{
0 x0008FFFF, {
0 xD9FF,
0 xDFFF}},
{
0 x00090000, {
0 xDA00,
0 xDC00}},
{
0 x00090001, {
0 xDA00,
0 xDC01}},
{
0 x00090002, {
0 xDA00,
0 xDC02}},
{
0 x00090004, {
0 xDA00,
0 xDC04}},
{
0 x00090008, {
0 xDA00,
0 xDC08}},
{
0 x00090010, {
0 xDA00,
0 xDC10}},
{
0 x00090020, {
0 xDA00,
0 xDC20}},
{
0 x00090040, {
0 xDA00,
0 xDC40}},
{
0 x00090080, {
0 xDA00,
0 xDC80}},
{
0 x00090100, {
0 xDA00,
0 xDD00}},
{
0 x00090200, {
0 xDA00,
0 xDE00}},
{
0 x00090400, {
0 xDA01,
0 xDC00}},
{
0 x00090800, {
0 xDA02,
0 xDC00}},
{
0 x00091000, {
0 xDA04,
0 xDC00}},
{
0 x00092000, {
0 xDA08,
0 xDC00}},
{
0 x00094000, {
0 xDA10,
0 xDC00}},
{
0 x00098000, {
0 xDA20,
0 xDC00}},
{
0 x000A0000, {
0 xDA40,
0 xDC00}},
{
0 x000B0000, {
0 xDA80,
0 xDC00}},
{
0 x000C0000, {
0 xDAC0,
0 xDC00}},
{
0 x000D0000, {
0 xDB00,
0 xDC00}},
{
0 x000FFFFF, {
0 xDBBF,
0 xDFFF}},
{
0 x0010FFFF, {
0 xDBFF,
0 xDFFF}}
};
// Invalid UTF-8 sequences
const char *
const kUtf8BadCases[] = {
"\xC0\x80" ,
"\xC1\xBF" ,
"\xE0\x80\x80" ,
"\xE0\x9F\xBF" ,
"\xF0\x80\x80\x80" ,
"\xF0\x8F\xBF\xBF" ,
"\xF4\x90\x80\x80" ,
"\xF7\xBF\xBF\xBF" ,
"\xF8\x80\x80\x80\x80" ,
"\xF8\x88\x80\x80\x80" ,
"\xF8\x92\x80\x80\x80" ,
"\xF8\x9F\xBF\xBF\xBF" ,
"\xF8\xA0\x80\x80\x80" ,
"\xF8\xA8\x80\x80\x80" ,
"\xF8\xB0\x80\x80\x80" ,
"\xF8\xBF\xBF\xBF\xBF" ,
"\xF9\x80\x80\x80\x88" ,
"\xF9\x84\x80\x80\x80" ,
"\xF9\xBF\xBF\xBF\xBF" ,
"\xFA\x80\x80\x80\x80" ,
"\xFA\x90\x80\x80\x80" ,
"\xFB\xBF\xBF\xBF\xBF" ,
"\xFC\x84\x80\x80\x80\x81" ,
"\xFC\x85\x80\x80\x80\x80" ,
"\xFC\x86\x80\x80\x80\x80" ,
"\xFC\x87\xBF\xBF\xBF\xBF" ,
"\xFC\x88\xA0\x80\x80\x80" ,
"\xFC\x89\x80\x80\x80\x80" ,
"\xFC\x8A\x80\x80\x80\x80" ,
"\xFC\x90\x80\x80\x80\x82" ,
"\xFD\x80\x80\x80\x80\x80" ,
"\xFD\xBF\xBF\xBF\xBF\xBF" ,
"\x80" ,
"\xC3" ,
"\xC3\xC3\x80" ,
"\xED\xA0\x80" ,
"\xED\xBF\x80" ,
"\xED\xBF\xBF" ,
"\xED\xA0\x80\xE0\xBF\xBF" ,
};
// Invalid UTF-16 sequences (0-terminated)
const Utf16BadCase kUtf16BadCases[] = {
// Leading surrogate not followed by trailing surrogate:
{{
0 xD800,
0 ,
0 }},
{{
0 xD800,
0 x41,
0 }},
{{
0 xD800,
0 xfe,
0 }},
{{
0 xD800,
0 x3bb,
0 }},
{{
0 xD800,
0 xD800,
0 }},
{{
0 xD800,
0 xFEFF,
0 }},
{{
0 xD800,
0 xFFFD,
0 }},
// Trailing surrogate, not preceded by a leading one.
{{
0 xDC00,
0 ,
0 }},
{{
0 xDE6D,
0 xD834,
0 }},
};
// Parameterized test instantiations:
INSTANTIATE_TEST_SUITE_P(Ucs4TestCases, Ucs4Test,
::testing::ValuesIn(kUcs4Cases));
INSTANTIATE_TEST_SUITE_P(Iso88591TestCases, Ucs2Test,
::testing::ValuesIn(kIso88591Cases));
INSTANTIATE_TEST_SUITE_P(Ucs2TestCases, Ucs2Test,
::testing::ValuesIn(kUcs2Cases));
INSTANTIATE_TEST_SUITE_P(Utf16TestCases, Utf16Test,
::testing::ValuesIn(kUtf16Cases));
INSTANTIATE_TEST_SUITE_P(BadUtf8TestCases, BadUtf8Test,
::testing::ValuesIn(kUtf8BadCases));
INSTANTIATE_TEST_SUITE_P(BadUtf16TestCases, BadUtf16Test,
::testing::ValuesIn(kUtf16BadCases));
INSTANTIATE_TEST_SUITE_P(Iso88591TestCases, Iso88591Test,
::testing::ValuesIn(kIso88591Cases));
;
}
// namespace nss_test
Messung V0.5 in Prozent C=96 H=99 G=97
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-06-07)
¤
*© Formatika GbR, Deutschland