tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

util_utf8_unittest.cc (39265B)


      1 // -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 // vim: set ts=2 et sw=2 tw=80:
      3 // This Source Code Form is subject to the terms of the Mozilla Public
      4 // License, v. 2.0. If a copy of the MPL was not distributed with this file,
      5 // You can obtain one at http://mozilla.org/MPL/2.0/.
      6 
      7 #include "secport.h"
      8 
      9 #include "gtest/gtest.h"
     10 #include "prnetdb.h"
     11 
     12 #include <stdint.h>
     13 #include <string.h>
     14 #include <string>
     15 
     16 namespace nss_test {
     17 
     18 // Structures to represent test cases.  These are small enough that
     19 // passing by value isn't a problem.
     20 
     21 struct Ucs4Case {
     22  PRUint32 c;
     23  const char *utf8;
     24 };
     25 
     26 struct Ucs2Case {
     27  PRUint16 c;
     28  const char *utf8;
     29 };
     30 
     31 struct Utf16Case {
     32  PRUint32 c;
     33  PRUint16 w[2];
     34 };
     35 
     36 struct Utf16BadCase {
     37  PRUint16 w[3];
     38 };
     39 
     40 // Test classes for parameterized tests:
     41 
     42 class Ucs4Test : public ::testing::TestWithParam<Ucs4Case> {};
     43 
     44 class Ucs2Test : public ::testing::TestWithParam<Ucs2Case> {};
     45 
     46 class Utf16Test : public ::testing::TestWithParam<Utf16Case> {};
     47 
     48 class BadUtf8Test : public ::testing::TestWithParam<const char *> {};
     49 
     50 class BadUtf16Test : public ::testing::TestWithParam<Utf16BadCase> {};
     51 
     52 class Iso88591Test : public ::testing::TestWithParam<Ucs2Case> {};
     53 
     54 // Tests of sec_port_ucs4_utf8_conversion_function, by itself, on
     55 // valid inputs:
     56 
     57 TEST_P(Ucs4Test, ToUtf8) {
     58  const Ucs4Case testCase = GetParam();
     59  PRUint32 nc = PR_htonl(testCase.c);
     60  unsigned char utf8[8] = {0};
     61  unsigned int len = 0;
     62 
     63  PRBool result = sec_port_ucs4_utf8_conversion_function(
     64      PR_FALSE, (unsigned char *)&nc, sizeof(nc), utf8, sizeof(utf8), &len);
     65 
     66  ASSERT_TRUE(result);
     67  ASSERT_LT(len, sizeof(utf8));
     68  EXPECT_EQ(std::string(testCase.utf8), std::string((char *)utf8, len));
     69  EXPECT_EQ('\0', utf8[len]);
     70 }
     71 
     72 TEST_P(Ucs4Test, FromUtf8) {
     73  const Ucs4Case testCase = GetParam();
     74  PRUint32 nc;
     75  unsigned int len = 0;
     76 
     77  PRBool result = sec_port_ucs4_utf8_conversion_function(
     78      PR_TRUE, (unsigned char *)testCase.utf8, strlen(testCase.utf8),
     79      (unsigned char *)&nc, sizeof(nc), &len);
     80 
     81  ASSERT_TRUE(result);
     82  ASSERT_EQ(sizeof(nc), len);
     83  EXPECT_EQ(testCase.c, PR_ntohl(nc));
     84 }
     85 
     86 TEST_P(Ucs4Test, DestTooSmall) {
     87  const Ucs4Case testCase = GetParam();
     88  PRUint32 nc = PR_htonl(testCase.c);
     89  unsigned char utf8[8];
     90  unsigned char *utf8end = utf8 + sizeof(utf8);
     91  unsigned int len = strlen(testCase.utf8) - 1;
     92 
     93  ASSERT_LE(len, sizeof(utf8));
     94 
     95  PRBool result = sec_port_ucs4_utf8_conversion_function(
     96      PR_FALSE, (unsigned char *)&nc, sizeof(nc), utf8end - len, len, &len);
     97 
     98  ASSERT_FALSE(result);
     99  ASSERT_EQ(strlen(testCase.utf8), len);
    100 }
    101 
    102 // Tests of sec_port_ucs2_utf8_conversion_function, by itself, on
    103 // valid inputs:
    104 
    105 TEST_P(Ucs2Test, ToUtf8) {
    106  const Ucs2Case testCase = GetParam();
    107  PRUint16 nc = PR_htons(testCase.c);
    108  unsigned char utf8[8] = {0};
    109  unsigned int len = 0;
    110 
    111  PRBool result = sec_port_ucs2_utf8_conversion_function(
    112      PR_FALSE, (unsigned char *)&nc, sizeof(nc), utf8, sizeof(utf8), &len);
    113 
    114  ASSERT_TRUE(result);
    115  ASSERT_LT(len, sizeof(utf8));
    116  EXPECT_EQ(std::string(testCase.utf8), std::string((char *)utf8, len));
    117  EXPECT_EQ('\0', utf8[len]);
    118 }
    119 
    120 TEST_P(Ucs2Test, FromUtf8) {
    121  const Ucs2Case testCase = GetParam();
    122  PRUint16 nc;
    123  unsigned int len = 0;
    124 
    125  PRBool result = sec_port_ucs2_utf8_conversion_function(
    126      PR_TRUE, (unsigned char *)testCase.utf8, strlen(testCase.utf8),
    127      (unsigned char *)&nc, sizeof(nc), &len);
    128 
    129  ASSERT_EQ(PR_TRUE, result);
    130  ASSERT_EQ(sizeof(nc), len);
    131  EXPECT_EQ(testCase.c, PR_ntohs(nc));
    132 }
    133 
    134 TEST_P(Ucs2Test, DestTooSmall) {
    135  const Ucs2Case testCase = GetParam();
    136  PRUint16 nc = PR_htons(testCase.c);
    137  unsigned char utf8[8];
    138  unsigned char *utf8end = utf8 + sizeof(utf8);
    139  unsigned int len = strlen(testCase.utf8) - 1;
    140 
    141  ASSERT_LE(len, sizeof(utf8));
    142 
    143  PRBool result = sec_port_ucs2_utf8_conversion_function(
    144      PR_FALSE, (unsigned char *)&nc, sizeof(nc), utf8end - len, len, &len);
    145 
    146  ASSERT_EQ(result, PR_FALSE);
    147  ASSERT_EQ(strlen(testCase.utf8), len);
    148 }
    149 
    150 // Tests using UTF-16 and UCS-4 conversion together:
    151 
    152 TEST_P(Utf16Test, From16To32) {
    153  const Utf16Case testCase = GetParam();
    154  PRUint16 from[2] = {PR_htons(testCase.w[0]), PR_htons(testCase.w[1])};
    155  PRUint32 to;
    156  unsigned char utf8[8];
    157  unsigned int len = 0;
    158 
    159  PRBool result = sec_port_ucs2_utf8_conversion_function(
    160      PR_FALSE, (unsigned char *)&from, sizeof(from), utf8, sizeof(utf8), &len);
    161 
    162  ASSERT_EQ(PR_TRUE, result);
    163 
    164  result = sec_port_ucs4_utf8_conversion_function(
    165      PR_TRUE, utf8, len, (unsigned char *)&to, sizeof(to), &len);
    166 
    167  ASSERT_EQ(PR_TRUE, result);
    168  ASSERT_EQ(sizeof(to), len);
    169  EXPECT_EQ(testCase.c, PR_ntohl(to));
    170 }
    171 
    172 TEST_P(Utf16Test, From32To16) {
    173  const Utf16Case testCase = GetParam();
    174  PRUint32 from = PR_htonl(testCase.c);
    175  unsigned char utf8[8];
    176  unsigned int len = 0;
    177 
    178  PRBool result = sec_port_ucs4_utf8_conversion_function(
    179      PR_FALSE, (unsigned char *)&from, sizeof(from), utf8, sizeof(utf8), &len);
    180 
    181  ASSERT_EQ(PR_TRUE, result);
    182  const std::string utf8copy((char *)utf8, len);
    183  PRUint16 to[2];
    184 
    185  result = sec_port_ucs2_utf8_conversion_function(
    186      PR_TRUE, utf8, len, (unsigned char *)&to, sizeof(to), &len);
    187 
    188  ASSERT_EQ(PR_TRUE, result);
    189  ASSERT_EQ(sizeof(to), len);
    190  EXPECT_EQ(testCase.w[0], PR_ntohs(to[0]));
    191  EXPECT_EQ(testCase.w[1], PR_ntohs(to[1]));
    192 }
    193 
    194 TEST_P(Utf16Test, SameUtf8) {
    195  const Utf16Case testCase = GetParam();
    196  PRUint32 from32 = PR_htonl(testCase.c);
    197  unsigned char utf8from32[8];
    198  unsigned int lenFrom32 = 0;
    199 
    200  PRBool result = sec_port_ucs4_utf8_conversion_function(
    201      PR_FALSE, (unsigned char *)&from32, sizeof(from32), utf8from32,
    202      sizeof(utf8from32), &lenFrom32);
    203 
    204  ASSERT_TRUE(result);
    205  ASSERT_LE(lenFrom32, sizeof(utf8from32));
    206 
    207  PRUint16 from16[2] = {PR_htons(testCase.w[0]), PR_htons(testCase.w[1])};
    208  unsigned char utf8from16[8];
    209  unsigned int lenFrom16 = 0;
    210 
    211  result = sec_port_ucs2_utf8_conversion_function(
    212      PR_FALSE, (unsigned char *)&from16, sizeof(from16), utf8from16,
    213      sizeof(utf8from16), &lenFrom16);
    214 
    215  ASSERT_TRUE(result);
    216  ASSERT_LE(lenFrom16, sizeof(utf8from16));
    217 
    218  EXPECT_EQ(std::string((char *)utf8from32, lenFrom32),
    219            std::string((char *)utf8from16, lenFrom16));
    220 }
    221 
    222 // Tests of invalid UTF-8 input:
    223 
    224 TEST_P(BadUtf8Test, HasNoUcs2) {
    225  const char *const utf8 = GetParam();
    226  unsigned char destBuf[30];
    227  unsigned int len = 0;
    228 
    229  PRBool result = sec_port_ucs2_utf8_conversion_function(
    230      PR_TRUE, (unsigned char *)utf8, strlen(utf8), destBuf, sizeof(destBuf),
    231      &len);
    232 
    233  EXPECT_FALSE(result);
    234 }
    235 
    236 TEST_P(BadUtf8Test, HasNoUcs4) {
    237  const char *const utf8 = GetParam();
    238  unsigned char destBuf[30];
    239  unsigned int len = 0;
    240 
    241  PRBool result = sec_port_ucs4_utf8_conversion_function(
    242      PR_TRUE, (unsigned char *)utf8, strlen(utf8), destBuf, sizeof(destBuf),
    243      &len);
    244 
    245  EXPECT_FALSE(result);
    246 }
    247 
    248 // Tests of invalid UTF-16 input:
    249 
    250 TEST_P(BadUtf16Test, HasNoUtf8) {
    251  const Utf16BadCase testCase = GetParam();
    252  Utf16BadCase srcBuf;
    253  unsigned int len;
    254  static const size_t maxLen = PR_ARRAY_SIZE(srcBuf.w);
    255 
    256  size_t srcLen = 0;
    257  while (testCase.w[srcLen] != 0) {
    258    srcBuf.w[srcLen] = PR_htons(testCase.w[srcLen]);
    259    srcLen++;
    260    ASSERT_LT(srcLen, maxLen);
    261  }
    262 
    263  unsigned char destBuf[18];
    264  PRBool result = sec_port_ucs2_utf8_conversion_function(
    265      PR_FALSE, (unsigned char *)srcBuf.w, srcLen * sizeof(PRUint16), destBuf,
    266      sizeof(destBuf), &len);
    267 
    268  EXPECT_FALSE(result);
    269 }
    270 
    271 // Tests of sec_port_iso88591_utf8_conversion_function on valid inputs:
    272 
    273 TEST_P(Iso88591Test, ToUtf8) {
    274  const Ucs2Case testCase = GetParam();
    275  unsigned char iso88591 = testCase.c;
    276  unsigned char utf8[3] = {0};
    277  unsigned int len = 0;
    278 
    279  ASSERT_EQ(testCase.c, (PRUint16)iso88591);
    280 
    281  PRBool result = sec_port_iso88591_utf8_conversion_function(
    282      &iso88591, 1, utf8, sizeof(utf8), &len);
    283 
    284  ASSERT_TRUE(result);
    285  ASSERT_LT(len, sizeof(utf8));
    286  EXPECT_EQ(std::string(testCase.utf8), std::string((char *)utf8, len));
    287  EXPECT_EQ(0U, utf8[len]);
    288 }
    289 
    290 // Tests for the various representations of NUL (which the above
    291 // NUL-terminated test cases omitted):
    292 
    293 TEST(Utf8Zeroes, From32To8) {
    294  unsigned int len;
    295  PRUint32 from = 0;
    296  unsigned char to;
    297 
    298  PRBool result = sec_port_ucs4_utf8_conversion_function(
    299      PR_FALSE, (unsigned char *)&from, sizeof(from), &to, sizeof(to), &len);
    300 
    301  ASSERT_TRUE(result);
    302  ASSERT_EQ(sizeof(to), len);
    303  EXPECT_EQ(0U, to);
    304 }
    305 
    306 TEST(Utf8Zeroes, From16To8) {
    307  unsigned int len;
    308  PRUint16 from = 0;
    309  unsigned char to;
    310 
    311  PRBool result = sec_port_ucs2_utf8_conversion_function(
    312      PR_FALSE, (unsigned char *)&from, sizeof(from), &to, sizeof(to), &len);
    313 
    314  ASSERT_TRUE(result);
    315  ASSERT_EQ(sizeof(to), len);
    316  EXPECT_EQ(0U, to);
    317 }
    318 
    319 TEST(Utf8Zeroes, From8To32) {
    320  unsigned int len;
    321  unsigned char from = 0;
    322  PRUint32 to;
    323 
    324  PRBool result = sec_port_ucs4_utf8_conversion_function(
    325      PR_TRUE, &from, sizeof(from), (unsigned char *)&to, sizeof(to), &len);
    326 
    327  ASSERT_TRUE(result);
    328  ASSERT_EQ(sizeof(to), len);
    329  EXPECT_EQ(0U, to);
    330 }
    331 
    332 TEST(Utf8Zeroes, From8To16) {
    333  unsigned int len;
    334  unsigned char from = 0;
    335  PRUint16 to;
    336 
    337  PRBool result = sec_port_ucs2_utf8_conversion_function(
    338      PR_TRUE, &from, sizeof(from), (unsigned char *)&to, sizeof(to), &len);
    339 
    340  ASSERT_TRUE(result);
    341  ASSERT_EQ(sizeof(to), len);
    342  EXPECT_EQ(0U, to);
    343 }
    344 
    345 // UCS-4 <-> UTF-8 cases
    346 
    347 const Ucs4Case kUcs4Cases[] = {
    348    {0x00000001, "\x01"},
    349    {0x00000002, "\x02"},
    350    {0x00000003, "\x03"},
    351    {0x00000004, "\x04"},
    352    {0x00000007, "\x07"},
    353    {0x00000008, "\x08"},
    354    {0x0000000F, "\x0F"},
    355    {0x00000010, "\x10"},
    356    {0x0000001F, "\x1F"},
    357    {0x00000020, "\x20"},
    358    {0x0000003F, "\x3F"},
    359    {0x00000040, "\x40"},
    360    {0x0000007F, "\x7F"},
    361 
    362    {0x00000080, "\xC2\x80"},
    363    {0x00000081, "\xC2\x81"},
    364    {0x00000082, "\xC2\x82"},
    365    {0x00000084, "\xC2\x84"},
    366    {0x00000088, "\xC2\x88"},
    367    {0x00000090, "\xC2\x90"},
    368    {0x000000A0, "\xC2\xA0"},
    369    {0x000000C0, "\xC3\x80"},
    370    {0x000000FF, "\xC3\xBF"},
    371    {0x00000100, "\xC4\x80"},
    372    {0x00000101, "\xC4\x81"},
    373    {0x00000102, "\xC4\x82"},
    374    {0x00000104, "\xC4\x84"},
    375    {0x00000108, "\xC4\x88"},
    376    {0x00000110, "\xC4\x90"},
    377    {0x00000120, "\xC4\xA0"},
    378    {0x00000140, "\xC5\x80"},
    379    {0x00000180, "\xC6\x80"},
    380    {0x000001FF, "\xC7\xBF"},
    381    {0x00000200, "\xC8\x80"},
    382    {0x00000201, "\xC8\x81"},
    383    {0x00000202, "\xC8\x82"},
    384    {0x00000204, "\xC8\x84"},
    385    {0x00000208, "\xC8\x88"},
    386    {0x00000210, "\xC8\x90"},
    387    {0x00000220, "\xC8\xA0"},
    388    {0x00000240, "\xC9\x80"},
    389    {0x00000280, "\xCA\x80"},
    390    {0x00000300, "\xCC\x80"},
    391    {0x000003FF, "\xCF\xBF"},
    392    {0x00000400, "\xD0\x80"},
    393    {0x00000401, "\xD0\x81"},
    394    {0x00000402, "\xD0\x82"},
    395    {0x00000404, "\xD0\x84"},
    396    {0x00000408, "\xD0\x88"},
    397    {0x00000410, "\xD0\x90"},
    398    {0x00000420, "\xD0\xA0"},
    399    {0x00000440, "\xD1\x80"},
    400    {0x00000480, "\xD2\x80"},
    401    {0x00000500, "\xD4\x80"},
    402    {0x00000600, "\xD8\x80"},
    403    {0x000007FF, "\xDF\xBF"},
    404 
    405    {0x00000800, "\xE0\xA0\x80"},
    406    {0x00000801, "\xE0\xA0\x81"},
    407    {0x00000802, "\xE0\xA0\x82"},
    408    {0x00000804, "\xE0\xA0\x84"},
    409    {0x00000808, "\xE0\xA0\x88"},
    410    {0x00000810, "\xE0\xA0\x90"},
    411    {0x00000820, "\xE0\xA0\xA0"},
    412    {0x00000840, "\xE0\xA1\x80"},
    413    {0x00000880, "\xE0\xA2\x80"},
    414    {0x00000900, "\xE0\xA4\x80"},
    415    {0x00000A00, "\xE0\xA8\x80"},
    416    {0x00000C00, "\xE0\xB0\x80"},
    417    {0x00000FFF, "\xE0\xBF\xBF"},
    418    {0x00001000, "\xE1\x80\x80"},
    419    {0x00001001, "\xE1\x80\x81"},
    420    {0x00001002, "\xE1\x80\x82"},
    421    {0x00001004, "\xE1\x80\x84"},
    422    {0x00001008, "\xE1\x80\x88"},
    423    {0x00001010, "\xE1\x80\x90"},
    424    {0x00001020, "\xE1\x80\xA0"},
    425    {0x00001040, "\xE1\x81\x80"},
    426    {0x00001080, "\xE1\x82\x80"},
    427    {0x00001100, "\xE1\x84\x80"},
    428    {0x00001200, "\xE1\x88\x80"},
    429    {0x00001400, "\xE1\x90\x80"},
    430    {0x00001800, "\xE1\xA0\x80"},
    431    {0x00001FFF, "\xE1\xBF\xBF"},
    432    {0x00002000, "\xE2\x80\x80"},
    433    {0x00002001, "\xE2\x80\x81"},
    434    {0x00002002, "\xE2\x80\x82"},
    435    {0x00002004, "\xE2\x80\x84"},
    436    {0x00002008, "\xE2\x80\x88"},
    437    {0x00002010, "\xE2\x80\x90"},
    438    {0x00002020, "\xE2\x80\xA0"},
    439    {0x00002040, "\xE2\x81\x80"},
    440    {0x00002080, "\xE2\x82\x80"},
    441    {0x00002100, "\xE2\x84\x80"},
    442    {0x00002200, "\xE2\x88\x80"},
    443    {0x00002400, "\xE2\x90\x80"},
    444    {0x00002800, "\xE2\xA0\x80"},
    445    {0x00003000, "\xE3\x80\x80"},
    446    {0x00003FFF, "\xE3\xBF\xBF"},
    447    {0x00004000, "\xE4\x80\x80"},
    448    {0x00004001, "\xE4\x80\x81"},
    449    {0x00004002, "\xE4\x80\x82"},
    450    {0x00004004, "\xE4\x80\x84"},
    451    {0x00004008, "\xE4\x80\x88"},
    452    {0x00004010, "\xE4\x80\x90"},
    453    {0x00004020, "\xE4\x80\xA0"},
    454    {0x00004040, "\xE4\x81\x80"},
    455    {0x00004080, "\xE4\x82\x80"},
    456    {0x00004100, "\xE4\x84\x80"},
    457    {0x00004200, "\xE4\x88\x80"},
    458    {0x00004400, "\xE4\x90\x80"},
    459    {0x00004800, "\xE4\xA0\x80"},
    460    {0x00005000, "\xE5\x80\x80"},
    461    {0x00006000, "\xE6\x80\x80"},
    462    {0x00007FFF, "\xE7\xBF\xBF"},
    463    {0x00008000, "\xE8\x80\x80"},
    464    {0x00008001, "\xE8\x80\x81"},
    465    {0x00008002, "\xE8\x80\x82"},
    466    {0x00008004, "\xE8\x80\x84"},
    467    {0x00008008, "\xE8\x80\x88"},
    468    {0x00008010, "\xE8\x80\x90"},
    469    {0x00008020, "\xE8\x80\xA0"},
    470    {0x00008040, "\xE8\x81\x80"},
    471    {0x00008080, "\xE8\x82\x80"},
    472    {0x00008100, "\xE8\x84\x80"},
    473    {0x00008200, "\xE8\x88\x80"},
    474    {0x00008400, "\xE8\x90\x80"},
    475    {0x00008800, "\xE8\xA0\x80"},
    476    {0x00009000, "\xE9\x80\x80"},
    477    {0x0000A000, "\xEA\x80\x80"},
    478    {0x0000C000, "\xEC\x80\x80"},
    479    {0x0000FFFF, "\xEF\xBF\xBF"},
    480 
    481    {0x00010000, "\xF0\x90\x80\x80"},
    482    {0x00010001, "\xF0\x90\x80\x81"},
    483    {0x00010002, "\xF0\x90\x80\x82"},
    484    {0x00010004, "\xF0\x90\x80\x84"},
    485    {0x00010008, "\xF0\x90\x80\x88"},
    486    {0x00010010, "\xF0\x90\x80\x90"},
    487    {0x00010020, "\xF0\x90\x80\xA0"},
    488    {0x00010040, "\xF0\x90\x81\x80"},
    489    {0x00010080, "\xF0\x90\x82\x80"},
    490    {0x00010100, "\xF0\x90\x84\x80"},
    491    {0x00010200, "\xF0\x90\x88\x80"},
    492    {0x00010400, "\xF0\x90\x90\x80"},
    493    {0x00010800, "\xF0\x90\xA0\x80"},
    494    {0x00011000, "\xF0\x91\x80\x80"},
    495    {0x00012000, "\xF0\x92\x80\x80"},
    496    {0x00014000, "\xF0\x94\x80\x80"},
    497    {0x00018000, "\xF0\x98\x80\x80"},
    498    {0x0001FFFF, "\xF0\x9F\xBF\xBF"},
    499    {0x00020000, "\xF0\xA0\x80\x80"},
    500    {0x00020001, "\xF0\xA0\x80\x81"},
    501    {0x00020002, "\xF0\xA0\x80\x82"},
    502    {0x00020004, "\xF0\xA0\x80\x84"},
    503    {0x00020008, "\xF0\xA0\x80\x88"},
    504    {0x00020010, "\xF0\xA0\x80\x90"},
    505    {0x00020020, "\xF0\xA0\x80\xA0"},
    506    {0x00020040, "\xF0\xA0\x81\x80"},
    507    {0x00020080, "\xF0\xA0\x82\x80"},
    508    {0x00020100, "\xF0\xA0\x84\x80"},
    509    {0x00020200, "\xF0\xA0\x88\x80"},
    510    {0x00020400, "\xF0\xA0\x90\x80"},
    511    {0x00020800, "\xF0\xA0\xA0\x80"},
    512    {0x00021000, "\xF0\xA1\x80\x80"},
    513    {0x00022000, "\xF0\xA2\x80\x80"},
    514    {0x00024000, "\xF0\xA4\x80\x80"},
    515    {0x00028000, "\xF0\xA8\x80\x80"},
    516    {0x00030000, "\xF0\xB0\x80\x80"},
    517    {0x0003FFFF, "\xF0\xBF\xBF\xBF"},
    518    {0x00040000, "\xF1\x80\x80\x80"},
    519    {0x00040001, "\xF1\x80\x80\x81"},
    520    {0x00040002, "\xF1\x80\x80\x82"},
    521    {0x00040004, "\xF1\x80\x80\x84"},
    522    {0x00040008, "\xF1\x80\x80\x88"},
    523    {0x00040010, "\xF1\x80\x80\x90"},
    524    {0x00040020, "\xF1\x80\x80\xA0"},
    525    {0x00040040, "\xF1\x80\x81\x80"},
    526    {0x00040080, "\xF1\x80\x82\x80"},
    527    {0x00040100, "\xF1\x80\x84\x80"},
    528    {0x00040200, "\xF1\x80\x88\x80"},
    529    {0x00040400, "\xF1\x80\x90\x80"},
    530    {0x00040800, "\xF1\x80\xA0\x80"},
    531    {0x00041000, "\xF1\x81\x80\x80"},
    532    {0x00042000, "\xF1\x82\x80\x80"},
    533    {0x00044000, "\xF1\x84\x80\x80"},
    534    {0x00048000, "\xF1\x88\x80\x80"},
    535    {0x00050000, "\xF1\x90\x80\x80"},
    536    {0x00060000, "\xF1\xA0\x80\x80"},
    537    {0x0007FFFF, "\xF1\xBF\xBF\xBF"},
    538    {0x00080000, "\xF2\x80\x80\x80"},
    539    {0x00080001, "\xF2\x80\x80\x81"},
    540    {0x00080002, "\xF2\x80\x80\x82"},
    541    {0x00080004, "\xF2\x80\x80\x84"},
    542    {0x00080008, "\xF2\x80\x80\x88"},
    543    {0x00080010, "\xF2\x80\x80\x90"},
    544    {0x00080020, "\xF2\x80\x80\xA0"},
    545    {0x00080040, "\xF2\x80\x81\x80"},
    546    {0x00080080, "\xF2\x80\x82\x80"},
    547    {0x00080100, "\xF2\x80\x84\x80"},
    548    {0x00080200, "\xF2\x80\x88\x80"},
    549    {0x00080400, "\xF2\x80\x90\x80"},
    550    {0x00080800, "\xF2\x80\xA0\x80"},
    551    {0x00081000, "\xF2\x81\x80\x80"},
    552    {0x00082000, "\xF2\x82\x80\x80"},
    553    {0x00084000, "\xF2\x84\x80\x80"},
    554    {0x00088000, "\xF2\x88\x80\x80"},
    555    {0x00090000, "\xF2\x90\x80\x80"},
    556    {0x000A0000, "\xF2\xA0\x80\x80"},
    557    {0x000C0000, "\xF3\x80\x80\x80"},
    558    {0x000FFFFF, "\xF3\xBF\xBF\xBF"},
    559    {0x00100000, "\xF4\x80\x80\x80"},
    560    {0x00100001, "\xF4\x80\x80\x81"},
    561    {0x00100002, "\xF4\x80\x80\x82"},
    562    {0x00100004, "\xF4\x80\x80\x84"},
    563    {0x00100008, "\xF4\x80\x80\x88"},
    564    {0x00100010, "\xF4\x80\x80\x90"},
    565    {0x00100020, "\xF4\x80\x80\xA0"},
    566    {0x00100040, "\xF4\x80\x81\x80"},
    567    {0x00100080, "\xF4\x80\x82\x80"},
    568    {0x00100100, "\xF4\x80\x84\x80"},
    569    {0x00100200, "\xF4\x80\x88\x80"},
    570    {0x00100400, "\xF4\x80\x90\x80"},
    571    {0x00100800, "\xF4\x80\xA0\x80"},
    572    {0x00101000, "\xF4\x81\x80\x80"},
    573    {0x00102000, "\xF4\x82\x80\x80"},
    574    {0x00104000, "\xF4\x84\x80\x80"},
    575    {0x00108000, "\xF4\x88\x80\x80"},
    576    {0x0010FFFF, "\xF4\x8F\xBF\xBF"},
    577 };
    578 
    579 // UCS-2 <-> UTF-8 cases (divided into ISO-8859-1 vs. not).
    580 
    581 const Ucs2Case kIso88591Cases[] = {
    582    {0x0001, "\x01"},     {0x0002, "\x02"},     {0x0003, "\x03"},
    583    {0x0004, "\x04"},     {0x0007, "\x07"},     {0x0008, "\x08"},
    584    {0x000F, "\x0F"},     {0x0010, "\x10"},     {0x001F, "\x1F"},
    585    {0x0020, "\x20"},     {0x003F, "\x3F"},     {0x0040, "\x40"},
    586    {0x007F, "\x7F"},
    587 
    588    {0x0080, "\xC2\x80"}, {0x0081, "\xC2\x81"}, {0x0082, "\xC2\x82"},
    589    {0x0084, "\xC2\x84"}, {0x0088, "\xC2\x88"}, {0x0090, "\xC2\x90"},
    590    {0x00A0, "\xC2\xA0"}, {0x00C0, "\xC3\x80"}, {0x00FF, "\xC3\xBF"},
    591 };
    592 
    593 const Ucs2Case kUcs2Cases[] = {
    594    {0x0100, "\xC4\x80"},     {0x0101, "\xC4\x81"},
    595    {0x0102, "\xC4\x82"},     {0x0104, "\xC4\x84"},
    596    {0x0108, "\xC4\x88"},     {0x0110, "\xC4\x90"},
    597    {0x0120, "\xC4\xA0"},     {0x0140, "\xC5\x80"},
    598    {0x0180, "\xC6\x80"},     {0x01FF, "\xC7\xBF"},
    599    {0x0200, "\xC8\x80"},     {0x0201, "\xC8\x81"},
    600    {0x0202, "\xC8\x82"},     {0x0204, "\xC8\x84"},
    601    {0x0208, "\xC8\x88"},     {0x0210, "\xC8\x90"},
    602    {0x0220, "\xC8\xA0"},     {0x0240, "\xC9\x80"},
    603    {0x0280, "\xCA\x80"},     {0x0300, "\xCC\x80"},
    604    {0x03FF, "\xCF\xBF"},     {0x0400, "\xD0\x80"},
    605    {0x0401, "\xD0\x81"},     {0x0402, "\xD0\x82"},
    606    {0x0404, "\xD0\x84"},     {0x0408, "\xD0\x88"},
    607    {0x0410, "\xD0\x90"},     {0x0420, "\xD0\xA0"},
    608    {0x0440, "\xD1\x80"},     {0x0480, "\xD2\x80"},
    609    {0x0500, "\xD4\x80"},     {0x0600, "\xD8\x80"},
    610    {0x07FF, "\xDF\xBF"},
    611 
    612    {0x0800, "\xE0\xA0\x80"}, {0x0801, "\xE0\xA0\x81"},
    613    {0x0802, "\xE0\xA0\x82"}, {0x0804, "\xE0\xA0\x84"},
    614    {0x0808, "\xE0\xA0\x88"}, {0x0810, "\xE0\xA0\x90"},
    615    {0x0820, "\xE0\xA0\xA0"}, {0x0840, "\xE0\xA1\x80"},
    616    {0x0880, "\xE0\xA2\x80"}, {0x0900, "\xE0\xA4\x80"},
    617    {0x0A00, "\xE0\xA8\x80"}, {0x0C00, "\xE0\xB0\x80"},
    618    {0x0FFF, "\xE0\xBF\xBF"}, {0x1000, "\xE1\x80\x80"},
    619    {0x1001, "\xE1\x80\x81"}, {0x1002, "\xE1\x80\x82"},
    620    {0x1004, "\xE1\x80\x84"}, {0x1008, "\xE1\x80\x88"},
    621    {0x1010, "\xE1\x80\x90"}, {0x1020, "\xE1\x80\xA0"},
    622    {0x1040, "\xE1\x81\x80"}, {0x1080, "\xE1\x82\x80"},
    623    {0x1100, "\xE1\x84\x80"}, {0x1200, "\xE1\x88\x80"},
    624    {0x1400, "\xE1\x90\x80"}, {0x1800, "\xE1\xA0\x80"},
    625    {0x1FFF, "\xE1\xBF\xBF"}, {0x2000, "\xE2\x80\x80"},
    626    {0x2001, "\xE2\x80\x81"}, {0x2002, "\xE2\x80\x82"},
    627    {0x2004, "\xE2\x80\x84"}, {0x2008, "\xE2\x80\x88"},
    628    {0x2010, "\xE2\x80\x90"}, {0x2020, "\xE2\x80\xA0"},
    629    {0x2040, "\xE2\x81\x80"}, {0x2080, "\xE2\x82\x80"},
    630    {0x2100, "\xE2\x84\x80"}, {0x2200, "\xE2\x88\x80"},
    631    {0x2400, "\xE2\x90\x80"}, {0x2800, "\xE2\xA0\x80"},
    632    {0x3000, "\xE3\x80\x80"}, {0x3FFF, "\xE3\xBF\xBF"},
    633    {0x4000, "\xE4\x80\x80"}, {0x4001, "\xE4\x80\x81"},
    634    {0x4002, "\xE4\x80\x82"}, {0x4004, "\xE4\x80\x84"},
    635    {0x4008, "\xE4\x80\x88"}, {0x4010, "\xE4\x80\x90"},
    636    {0x4020, "\xE4\x80\xA0"}, {0x4040, "\xE4\x81\x80"},
    637    {0x4080, "\xE4\x82\x80"}, {0x4100, "\xE4\x84\x80"},
    638    {0x4200, "\xE4\x88\x80"}, {0x4400, "\xE4\x90\x80"},
    639    {0x4800, "\xE4\xA0\x80"}, {0x5000, "\xE5\x80\x80"},
    640    {0x6000, "\xE6\x80\x80"}, {0x7FFF, "\xE7\xBF\xBF"},
    641    {0x8000, "\xE8\x80\x80"}, {0x8001, "\xE8\x80\x81"},
    642    {0x8002, "\xE8\x80\x82"}, {0x8004, "\xE8\x80\x84"},
    643    {0x8008, "\xE8\x80\x88"}, {0x8010, "\xE8\x80\x90"},
    644    {0x8020, "\xE8\x80\xA0"}, {0x8040, "\xE8\x81\x80"},
    645    {0x8080, "\xE8\x82\x80"}, {0x8100, "\xE8\x84\x80"},
    646    {0x8200, "\xE8\x88\x80"}, {0x8400, "\xE8\x90\x80"},
    647    {0x8800, "\xE8\xA0\x80"}, {0x9000, "\xE9\x80\x80"},
    648    {0xA000, "\xEA\x80\x80"}, {0xC000, "\xEC\x80\x80"},
    649    {0xFB01, "\xEF\xAC\x81"}, {0xFFFF, "\xEF\xBF\xBF"}};
    650 
    651 // UTF-16 <-> UCS-4 cases
    652 
    653 const Utf16Case kUtf16Cases[] = {{0x00010000, {0xD800, 0xDC00}},
    654                                 {0x00010001, {0xD800, 0xDC01}},
    655                                 {0x00010002, {0xD800, 0xDC02}},
    656                                 {0x00010003, {0xD800, 0xDC03}},
    657                                 {0x00010004, {0xD800, 0xDC04}},
    658                                 {0x00010007, {0xD800, 0xDC07}},
    659                                 {0x00010008, {0xD800, 0xDC08}},
    660                                 {0x0001000F, {0xD800, 0xDC0F}},
    661                                 {0x00010010, {0xD800, 0xDC10}},
    662                                 {0x0001001F, {0xD800, 0xDC1F}},
    663                                 {0x00010020, {0xD800, 0xDC20}},
    664                                 {0x0001003F, {0xD800, 0xDC3F}},
    665                                 {0x00010040, {0xD800, 0xDC40}},
    666                                 {0x0001007F, {0xD800, 0xDC7F}},
    667                                 {0x00010080, {0xD800, 0xDC80}},
    668                                 {0x00010081, {0xD800, 0xDC81}},
    669                                 {0x00010082, {0xD800, 0xDC82}},
    670                                 {0x00010084, {0xD800, 0xDC84}},
    671                                 {0x00010088, {0xD800, 0xDC88}},
    672                                 {0x00010090, {0xD800, 0xDC90}},
    673                                 {0x000100A0, {0xD800, 0xDCA0}},
    674                                 {0x000100C0, {0xD800, 0xDCC0}},
    675                                 {0x000100FF, {0xD800, 0xDCFF}},
    676                                 {0x00010100, {0xD800, 0xDD00}},
    677                                 {0x00010101, {0xD800, 0xDD01}},
    678                                 {0x00010102, {0xD800, 0xDD02}},
    679                                 {0x00010104, {0xD800, 0xDD04}},
    680                                 {0x00010108, {0xD800, 0xDD08}},
    681                                 {0x00010110, {0xD800, 0xDD10}},
    682                                 {0x00010120, {0xD800, 0xDD20}},
    683                                 {0x00010140, {0xD800, 0xDD40}},
    684                                 {0x00010180, {0xD800, 0xDD80}},
    685                                 {0x000101FF, {0xD800, 0xDDFF}},
    686                                 {0x00010200, {0xD800, 0xDE00}},
    687                                 {0x00010201, {0xD800, 0xDE01}},
    688                                 {0x00010202, {0xD800, 0xDE02}},
    689                                 {0x00010204, {0xD800, 0xDE04}},
    690                                 {0x00010208, {0xD800, 0xDE08}},
    691                                 {0x00010210, {0xD800, 0xDE10}},
    692                                 {0x00010220, {0xD800, 0xDE20}},
    693                                 {0x00010240, {0xD800, 0xDE40}},
    694                                 {0x00010280, {0xD800, 0xDE80}},
    695                                 {0x00010300, {0xD800, 0xDF00}},
    696                                 {0x000103FF, {0xD800, 0xDFFF}},
    697                                 {0x00010400, {0xD801, 0xDC00}},
    698                                 {0x00010401, {0xD801, 0xDC01}},
    699                                 {0x00010402, {0xD801, 0xDC02}},
    700                                 {0x00010404, {0xD801, 0xDC04}},
    701                                 {0x00010408, {0xD801, 0xDC08}},
    702                                 {0x00010410, {0xD801, 0xDC10}},
    703                                 {0x00010420, {0xD801, 0xDC20}},
    704                                 {0x00010440, {0xD801, 0xDC40}},
    705                                 {0x00010480, {0xD801, 0xDC80}},
    706                                 {0x00010500, {0xD801, 0xDD00}},
    707                                 {0x00010600, {0xD801, 0xDE00}},
    708                                 {0x000107FF, {0xD801, 0xDFFF}},
    709                                 {0x00010800, {0xD802, 0xDC00}},
    710                                 {0x00010801, {0xD802, 0xDC01}},
    711                                 {0x00010802, {0xD802, 0xDC02}},
    712                                 {0x00010804, {0xD802, 0xDC04}},
    713                                 {0x00010808, {0xD802, 0xDC08}},
    714                                 {0x00010810, {0xD802, 0xDC10}},
    715                                 {0x00010820, {0xD802, 0xDC20}},
    716                                 {0x00010840, {0xD802, 0xDC40}},
    717                                 {0x00010880, {0xD802, 0xDC80}},
    718                                 {0x00010900, {0xD802, 0xDD00}},
    719                                 {0x00010A00, {0xD802, 0xDE00}},
    720                                 {0x00010C00, {0xD803, 0xDC00}},
    721                                 {0x00010FFF, {0xD803, 0xDFFF}},
    722                                 {0x00011000, {0xD804, 0xDC00}},
    723                                 {0x00011001, {0xD804, 0xDC01}},
    724                                 {0x00011002, {0xD804, 0xDC02}},
    725                                 {0x00011004, {0xD804, 0xDC04}},
    726                                 {0x00011008, {0xD804, 0xDC08}},
    727                                 {0x00011010, {0xD804, 0xDC10}},
    728                                 {0x00011020, {0xD804, 0xDC20}},
    729                                 {0x00011040, {0xD804, 0xDC40}},
    730                                 {0x00011080, {0xD804, 0xDC80}},
    731                                 {0x00011100, {0xD804, 0xDD00}},
    732                                 {0x00011200, {0xD804, 0xDE00}},
    733                                 {0x00011400, {0xD805, 0xDC00}},
    734                                 {0x00011800, {0xD806, 0xDC00}},
    735                                 {0x00011FFF, {0xD807, 0xDFFF}},
    736                                 {0x00012000, {0xD808, 0xDC00}},
    737                                 {0x00012001, {0xD808, 0xDC01}},
    738                                 {0x00012002, {0xD808, 0xDC02}},
    739                                 {0x00012004, {0xD808, 0xDC04}},
    740                                 {0x00012008, {0xD808, 0xDC08}},
    741                                 {0x00012010, {0xD808, 0xDC10}},
    742                                 {0x00012020, {0xD808, 0xDC20}},
    743                                 {0x00012040, {0xD808, 0xDC40}},
    744                                 {0x00012080, {0xD808, 0xDC80}},
    745                                 {0x00012100, {0xD808, 0xDD00}},
    746                                 {0x00012200, {0xD808, 0xDE00}},
    747                                 {0x00012400, {0xD809, 0xDC00}},
    748                                 {0x00012800, {0xD80A, 0xDC00}},
    749                                 {0x00013000, {0xD80C, 0xDC00}},
    750                                 {0x00013FFF, {0xD80F, 0xDFFF}},
    751                                 {0x00014000, {0xD810, 0xDC00}},
    752                                 {0x00014001, {0xD810, 0xDC01}},
    753                                 {0x00014002, {0xD810, 0xDC02}},
    754                                 {0x00014004, {0xD810, 0xDC04}},
    755                                 {0x00014008, {0xD810, 0xDC08}},
    756                                 {0x00014010, {0xD810, 0xDC10}},
    757                                 {0x00014020, {0xD810, 0xDC20}},
    758                                 {0x00014040, {0xD810, 0xDC40}},
    759                                 {0x00014080, {0xD810, 0xDC80}},
    760                                 {0x00014100, {0xD810, 0xDD00}},
    761                                 {0x00014200, {0xD810, 0xDE00}},
    762                                 {0x00014400, {0xD811, 0xDC00}},
    763                                 {0x00014800, {0xD812, 0xDC00}},
    764                                 {0x00015000, {0xD814, 0xDC00}},
    765                                 {0x00016000, {0xD818, 0xDC00}},
    766                                 {0x00017FFF, {0xD81F, 0xDFFF}},
    767                                 {0x00018000, {0xD820, 0xDC00}},
    768                                 {0x00018001, {0xD820, 0xDC01}},
    769                                 {0x00018002, {0xD820, 0xDC02}},
    770                                 {0x00018004, {0xD820, 0xDC04}},
    771                                 {0x00018008, {0xD820, 0xDC08}},
    772                                 {0x00018010, {0xD820, 0xDC10}},
    773                                 {0x00018020, {0xD820, 0xDC20}},
    774                                 {0x00018040, {0xD820, 0xDC40}},
    775                                 {0x00018080, {0xD820, 0xDC80}},
    776                                 {0x00018100, {0xD820, 0xDD00}},
    777                                 {0x00018200, {0xD820, 0xDE00}},
    778                                 {0x00018400, {0xD821, 0xDC00}},
    779                                 {0x00018800, {0xD822, 0xDC00}},
    780                                 {0x00019000, {0xD824, 0xDC00}},
    781                                 {0x0001A000, {0xD828, 0xDC00}},
    782                                 {0x0001C000, {0xD830, 0xDC00}},
    783                                 {0x0001FFFF, {0xD83F, 0xDFFF}},
    784                                 {0x00020000, {0xD840, 0xDC00}},
    785                                 {0x00020001, {0xD840, 0xDC01}},
    786                                 {0x00020002, {0xD840, 0xDC02}},
    787                                 {0x00020004, {0xD840, 0xDC04}},
    788                                 {0x00020008, {0xD840, 0xDC08}},
    789                                 {0x00020010, {0xD840, 0xDC10}},
    790                                 {0x00020020, {0xD840, 0xDC20}},
    791                                 {0x00020040, {0xD840, 0xDC40}},
    792                                 {0x00020080, {0xD840, 0xDC80}},
    793                                 {0x00020100, {0xD840, 0xDD00}},
    794                                 {0x00020200, {0xD840, 0xDE00}},
    795                                 {0x00020400, {0xD841, 0xDC00}},
    796                                 {0x00020800, {0xD842, 0xDC00}},
    797                                 {0x00021000, {0xD844, 0xDC00}},
    798                                 {0x00022000, {0xD848, 0xDC00}},
    799                                 {0x00024000, {0xD850, 0xDC00}},
    800                                 {0x00028000, {0xD860, 0xDC00}},
    801                                 {0x0002FFFF, {0xD87F, 0xDFFF}},
    802                                 {0x00030000, {0xD880, 0xDC00}},
    803                                 {0x00030001, {0xD880, 0xDC01}},
    804                                 {0x00030002, {0xD880, 0xDC02}},
    805                                 {0x00030004, {0xD880, 0xDC04}},
    806                                 {0x00030008, {0xD880, 0xDC08}},
    807                                 {0x00030010, {0xD880, 0xDC10}},
    808                                 {0x00030020, {0xD880, 0xDC20}},
    809                                 {0x00030040, {0xD880, 0xDC40}},
    810                                 {0x00030080, {0xD880, 0xDC80}},
    811                                 {0x00030100, {0xD880, 0xDD00}},
    812                                 {0x00030200, {0xD880, 0xDE00}},
    813                                 {0x00030400, {0xD881, 0xDC00}},
    814                                 {0x00030800, {0xD882, 0xDC00}},
    815                                 {0x00031000, {0xD884, 0xDC00}},
    816                                 {0x00032000, {0xD888, 0xDC00}},
    817                                 {0x00034000, {0xD890, 0xDC00}},
    818                                 {0x00038000, {0xD8A0, 0xDC00}},
    819                                 {0x0003FFFF, {0xD8BF, 0xDFFF}},
    820                                 {0x00040000, {0xD8C0, 0xDC00}},
    821                                 {0x00040001, {0xD8C0, 0xDC01}},
    822                                 {0x00040002, {0xD8C0, 0xDC02}},
    823                                 {0x00040004, {0xD8C0, 0xDC04}},
    824                                 {0x00040008, {0xD8C0, 0xDC08}},
    825                                 {0x00040010, {0xD8C0, 0xDC10}},
    826                                 {0x00040020, {0xD8C0, 0xDC20}},
    827                                 {0x00040040, {0xD8C0, 0xDC40}},
    828                                 {0x00040080, {0xD8C0, 0xDC80}},
    829                                 {0x00040100, {0xD8C0, 0xDD00}},
    830                                 {0x00040200, {0xD8C0, 0xDE00}},
    831                                 {0x00040400, {0xD8C1, 0xDC00}},
    832                                 {0x00040800, {0xD8C2, 0xDC00}},
    833                                 {0x00041000, {0xD8C4, 0xDC00}},
    834                                 {0x00042000, {0xD8C8, 0xDC00}},
    835                                 {0x00044000, {0xD8D0, 0xDC00}},
    836                                 {0x00048000, {0xD8E0, 0xDC00}},
    837                                 {0x0004FFFF, {0xD8FF, 0xDFFF}},
    838                                 {0x00050000, {0xD900, 0xDC00}},
    839                                 {0x00050001, {0xD900, 0xDC01}},
    840                                 {0x00050002, {0xD900, 0xDC02}},
    841                                 {0x00050004, {0xD900, 0xDC04}},
    842                                 {0x00050008, {0xD900, 0xDC08}},
    843                                 {0x00050010, {0xD900, 0xDC10}},
    844                                 {0x00050020, {0xD900, 0xDC20}},
    845                                 {0x00050040, {0xD900, 0xDC40}},
    846                                 {0x00050080, {0xD900, 0xDC80}},
    847                                 {0x00050100, {0xD900, 0xDD00}},
    848                                 {0x00050200, {0xD900, 0xDE00}},
    849                                 {0x00050400, {0xD901, 0xDC00}},
    850                                 {0x00050800, {0xD902, 0xDC00}},
    851                                 {0x00051000, {0xD904, 0xDC00}},
    852                                 {0x00052000, {0xD908, 0xDC00}},
    853                                 {0x00054000, {0xD910, 0xDC00}},
    854                                 {0x00058000, {0xD920, 0xDC00}},
    855                                 {0x00060000, {0xD940, 0xDC00}},
    856                                 {0x00070000, {0xD980, 0xDC00}},
    857                                 {0x0007FFFF, {0xD9BF, 0xDFFF}},
    858                                 {0x00080000, {0xD9C0, 0xDC00}},
    859                                 {0x00080001, {0xD9C0, 0xDC01}},
    860                                 {0x00080002, {0xD9C0, 0xDC02}},
    861                                 {0x00080004, {0xD9C0, 0xDC04}},
    862                                 {0x00080008, {0xD9C0, 0xDC08}},
    863                                 {0x00080010, {0xD9C0, 0xDC10}},
    864                                 {0x00080020, {0xD9C0, 0xDC20}},
    865                                 {0x00080040, {0xD9C0, 0xDC40}},
    866                                 {0x00080080, {0xD9C0, 0xDC80}},
    867                                 {0x00080100, {0xD9C0, 0xDD00}},
    868                                 {0x00080200, {0xD9C0, 0xDE00}},
    869                                 {0x00080400, {0xD9C1, 0xDC00}},
    870                                 {0x00080800, {0xD9C2, 0xDC00}},
    871                                 {0x00081000, {0xD9C4, 0xDC00}},
    872                                 {0x00082000, {0xD9C8, 0xDC00}},
    873                                 {0x00084000, {0xD9D0, 0xDC00}},
    874                                 {0x00088000, {0xD9E0, 0xDC00}},
    875                                 {0x0008FFFF, {0xD9FF, 0xDFFF}},
    876                                 {0x00090000, {0xDA00, 0xDC00}},
    877                                 {0x00090001, {0xDA00, 0xDC01}},
    878                                 {0x00090002, {0xDA00, 0xDC02}},
    879                                 {0x00090004, {0xDA00, 0xDC04}},
    880                                 {0x00090008, {0xDA00, 0xDC08}},
    881                                 {0x00090010, {0xDA00, 0xDC10}},
    882                                 {0x00090020, {0xDA00, 0xDC20}},
    883                                 {0x00090040, {0xDA00, 0xDC40}},
    884                                 {0x00090080, {0xDA00, 0xDC80}},
    885                                 {0x00090100, {0xDA00, 0xDD00}},
    886                                 {0x00090200, {0xDA00, 0xDE00}},
    887                                 {0x00090400, {0xDA01, 0xDC00}},
    888                                 {0x00090800, {0xDA02, 0xDC00}},
    889                                 {0x00091000, {0xDA04, 0xDC00}},
    890                                 {0x00092000, {0xDA08, 0xDC00}},
    891                                 {0x00094000, {0xDA10, 0xDC00}},
    892                                 {0x00098000, {0xDA20, 0xDC00}},
    893                                 {0x000A0000, {0xDA40, 0xDC00}},
    894                                 {0x000B0000, {0xDA80, 0xDC00}},
    895                                 {0x000C0000, {0xDAC0, 0xDC00}},
    896                                 {0x000D0000, {0xDB00, 0xDC00}},
    897                                 {0x000FFFFF, {0xDBBF, 0xDFFF}},
    898                                 {0x0010FFFF, {0xDBFF, 0xDFFF}}
    899 
    900 };
    901 
    902 // Invalid UTF-8 sequences
    903 
    904 const char *const kUtf8BadCases[] = {
    905    "\xC0\x80",
    906    "\xC1\xBF",
    907    "\xE0\x80\x80",
    908    "\xE0\x9F\xBF",
    909    "\xF0\x80\x80\x80",
    910    "\xF0\x8F\xBF\xBF",
    911    "\xF4\x90\x80\x80",
    912    "\xF7\xBF\xBF\xBF",
    913    "\xF8\x80\x80\x80\x80",
    914    "\xF8\x88\x80\x80\x80",
    915    "\xF8\x92\x80\x80\x80",
    916    "\xF8\x9F\xBF\xBF\xBF",
    917    "\xF8\xA0\x80\x80\x80",
    918    "\xF8\xA8\x80\x80\x80",
    919    "\xF8\xB0\x80\x80\x80",
    920    "\xF8\xBF\xBF\xBF\xBF",
    921    "\xF9\x80\x80\x80\x88",
    922    "\xF9\x84\x80\x80\x80",
    923    "\xF9\xBF\xBF\xBF\xBF",
    924    "\xFA\x80\x80\x80\x80",
    925    "\xFA\x90\x80\x80\x80",
    926    "\xFB\xBF\xBF\xBF\xBF",
    927    "\xFC\x84\x80\x80\x80\x81",
    928    "\xFC\x85\x80\x80\x80\x80",
    929    "\xFC\x86\x80\x80\x80\x80",
    930    "\xFC\x87\xBF\xBF\xBF\xBF",
    931    "\xFC\x88\xA0\x80\x80\x80",
    932    "\xFC\x89\x80\x80\x80\x80",
    933    "\xFC\x8A\x80\x80\x80\x80",
    934    "\xFC\x90\x80\x80\x80\x82",
    935    "\xFD\x80\x80\x80\x80\x80",
    936    "\xFD\xBF\xBF\xBF\xBF\xBF",
    937    "\x80",
    938    "\xC3",
    939    "\xC3\xC3\x80",
    940    "\xED\xA0\x80",
    941    "\xED\xBF\x80",
    942    "\xED\xBF\xBF",
    943    "\xED\xA0\x80\xE0\xBF\xBF",
    944 };
    945 
    946 // Invalid UTF-16 sequences (0-terminated)
    947 
    948 const Utf16BadCase kUtf16BadCases[] = {
    949    // Leading surrogate not followed by trailing surrogate:
    950    {{0xD800, 0, 0}},
    951    {{0xD800, 0x41, 0}},
    952    {{0xD800, 0xfe, 0}},
    953    {{0xD800, 0x3bb, 0}},
    954    {{0xD800, 0xD800, 0}},
    955    {{0xD800, 0xFEFF, 0}},
    956    {{0xD800, 0xFFFD, 0}},
    957    // Trailing surrogate, not preceded by a leading one.
    958    {{0xDC00, 0, 0}},
    959    {{0xDE6D, 0xD834, 0}},
    960 };
    961 
    962 // Parameterized test instantiations:
    963 
    964 INSTANTIATE_TEST_SUITE_P(Ucs4TestCases, Ucs4Test,
    965                         ::testing::ValuesIn(kUcs4Cases));
    966 
    967 INSTANTIATE_TEST_SUITE_P(Iso88591TestCases, Ucs2Test,
    968                         ::testing::ValuesIn(kIso88591Cases));
    969 
    970 INSTANTIATE_TEST_SUITE_P(Ucs2TestCases, Ucs2Test,
    971                         ::testing::ValuesIn(kUcs2Cases));
    972 
    973 INSTANTIATE_TEST_SUITE_P(Utf16TestCases, Utf16Test,
    974                         ::testing::ValuesIn(kUtf16Cases));
    975 
    976 INSTANTIATE_TEST_SUITE_P(BadUtf8TestCases, BadUtf8Test,
    977                         ::testing::ValuesIn(kUtf8BadCases));
    978 
    979 INSTANTIATE_TEST_SUITE_P(BadUtf16TestCases, BadUtf16Test,
    980                         ::testing::ValuesIn(kUtf16BadCases));
    981 
    982 INSTANTIATE_TEST_SUITE_P(Iso88591TestCases, Iso88591Test,
    983                         ::testing::ValuesIn(kIso88591Cases));
    984 ;
    985 
    986 }  // namespace nss_test