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