16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************** 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT: 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1998-2012, International Business Machines Corporation and 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/ 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File test.c 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History: 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Date Name Description 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 05/01/2000 Madhu Creation 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utf16.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cintltst.h" 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h> 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LENGTHOF(array) (sizeof(array)/sizeof((array)[0])) 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void printUChars(const UChar *uchars); 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCodeUnitValues(void); 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCharLength(void); 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestGetChar(void); 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestNextPrevChar(void); 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestNulTerminated(void); 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestFwdBack(void); 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestSetChar(void); 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestAppendChar(void); 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestAppend(void); 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestSurrogate(void); 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addUTF16Test(TestNode** root); 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgaddUTF16Test(TestNode** root) 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestCodeUnitValues, "utf16tst/TestCodeUnitValues"); 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestCharLength, "utf16tst/TestCharLength"); 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestGetChar, "utf16tst/TestGetChar"); 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestNextPrevChar, "utf16tst/TestNextPrevChar"); 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestNulTerminated, "utf16tst/TestNulTerminated"); 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestFwdBack, "utf16tst/TestFwdBack"); 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestSetChar, "utf16tst/TestSetChar"); 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestAppendChar, "utf16tst/TestAppendChar"); 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestAppend, "utf16tst/TestAppend"); 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestSurrogate, "utf16tst/TestSurrogate"); 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCodeUnitValues() 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t codeunit[]={0x0000,0xe065,0x20ac,0xd7ff,0xd800,0xd841,0xd905,0xdbff,0xdc00,0xdc02,0xddee,0xdfff,0}; 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int16_t i; 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<sizeof(codeunit)/sizeof(codeunit[0]); i++){ 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar c=codeunit[i]; 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing code unit value of %x\n", c); 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(i<4){ 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!UTF16_IS_SINGLE(c) || UTF16_IS_LEAD(c) || UTF16_IS_TRAIL(c) || !U16_IS_SINGLE(c) || U16_IS_LEAD(c) || U16_IS_TRAIL(c)){ 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: %x is a single character\n", c); 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(i >= 4 && i< 8){ 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!UTF16_IS_LEAD(c) || UTF16_IS_SINGLE(c) || UTF16_IS_TRAIL(c) || !U16_IS_LEAD(c) || U16_IS_SINGLE(c) || U16_IS_TRAIL(c)){ 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: %x is a first surrogate\n", c); 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(i >= 8 && i< 12){ 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!UTF16_IS_TRAIL(c) || UTF16_IS_SINGLE(c) || UTF16_IS_LEAD(c) || !U16_IS_TRAIL(c) || U16_IS_SINGLE(c) || U16_IS_LEAD(c)){ 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: %x is a second surrogate\n", c); 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCharLength() 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint32_t codepoint[]={ 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1, 0x0061, 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1, 0xe065, 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1, 0x20ac, 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2, 0x20402, 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2, 0x23456, 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2, 0x24506, 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2, 0x20402, 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2, 0x10402, 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1, 0xd7ff, 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1, 0xe000 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int16_t i; 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool multiple; 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<sizeof(codepoint)/sizeof(codepoint[0]); i=(int16_t)(i+2)){ 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c=codepoint[i+1]; 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(UTF16_CHAR_LENGTH(c) != (uint16_t)codepoint[i] || U16_LENGTH(c) != (uint16_t)codepoint[i]){ 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("The no: of code units for %lx:- Expected: %d Got: %d\n", c, codepoint[i], UTF16_CHAR_LENGTH(c)); 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("The no: of code units for %lx is %d\n",c, UTF16_CHAR_LENGTH(c) ); 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org multiple=(UBool)(codepoint[i] == 1 ? FALSE : TRUE); 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(UTF16_NEED_MULTIPLE_UCHAR(c) != multiple){ 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_NEED_MULTIPLE_UCHAR failed for %lx\n", c); 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestGetChar() 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UChar input[]={ 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* code unit,*/ 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xdc00, 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20ac, 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd841, 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x61, 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd841, 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xdc02, 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd842, 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xdc06, 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd842, 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd7ff, 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xdc41, 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xe000, 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd800 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UChar32 result[]={ 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*codepoint-unsafe, codepoint-safe(not strict) codepoint-safe(strict)*/ 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (UChar32)0xfca10000, 0xdc00, UTF_ERROR_VALUE, 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20ac, 0x20ac, 0x20ac, 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x12861, 0xd841, UTF_ERROR_VALUE, 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x61, 0x61, 0x61, 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20402, 0x20402, 0x20402, 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20402, 0x20402, 0x20402, 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20806, 0x20806, 0x20806, 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20806, 0x20806, 0x20806, 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x00, 0x00, 0x00, 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x203ff, 0xd842, UTF_ERROR_VALUE, 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd7ff, 0xd7ff, 0xd7ff, 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfc41, 0xdc41, UTF_ERROR_VALUE, 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xe000, 0xe000, 0xe000, 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x11734, 0xd800, UTF_ERROR_VALUE 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t i=0; 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c; 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t offset=0; 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(offset=0; offset<sizeof(input)/U_SIZEOF_UCHAR; offset++) { 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(0<offset && offset<sizeof(input)/U_SIZEOF_UCHAR-1){ 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_GET_CHAR_UNSAFE(input, offset, c); 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i]){ 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_GET_CHAR_UNSAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, result[i], c); 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_GET_UNSAFE(input, offset, c); 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i]){ 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_GET_CHAR_UNSAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, result[i], c); 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_GET_CHAR_SAFE(input, 0, offset, sizeof(input)/U_SIZEOF_UCHAR, c, FALSE); 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i+1]){ 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_GET_CHAR_SAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, result[i+1], c); 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_GET(input, 0, offset, sizeof(input)/U_SIZEOF_UCHAR, c); 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i+1]){ 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_GET failed for offset=%ld. Expected:%lx Got:%lx\n", offset, result[i+1], c); 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_GET_CHAR_SAFE(input, 0, offset, sizeof(input)/U_SIZEOF_UCHAR, c, TRUE); 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i+2]){ 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_GET_CHAR_SAFE(strict) failed for offset=%ld. Expected:%lx Got:%lx\n", offset, result[i+2], c); 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=(uint16_t)(i+3); 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestNextPrevChar(){ 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UChar input[]={0x0061, 0xd800, 0xdc00, 0xdbff, 0xdfff, 0x0062, 0xd841, 0xd7ff, 0xd841, 0xdc41, 0xdc00, 0x0000}; 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UChar32 result[]={ 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*next_unsafe next_safe_ns next_safe_s prev_unsafe prev_safe_ns prev_safe_s*/ 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0061, 0x0061, 0x0061, 0x0000, 0x0000, 0x0000, 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x10000, 0x10000, 0x10000, 0x120400, 0xdc00, UTF_ERROR_VALUE, 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xdc00, 0xdc00, UTF_ERROR_VALUE, 0x20441, 0x20441, 0x20441, 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x10ffff, 0x10ffff, 0x10ffff, 0xd841, 0xd841, UTF_ERROR_VALUE, 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xdfff, 0xdfff, UTF_ERROR_VALUE, 0xd7ff, 0xd7ff, 0xd7ff, 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0062, 0x0062, 0x0062, 0xd841, 0xd841, UTF_ERROR_VALUE, 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x1ffff, 0xd841, UTF_ERROR_VALUE, 0x0062, 0x0062, 0x0062, 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd7ff, 0xd7ff, 0xd7ff, 0x10ffff, 0x10ffff, 0x10ffff, 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20441, 0x20441, 0x20441, 0xdbff, 0xdbff, UTF_ERROR_VALUE, 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xdc41, 0xdc41, UTF_ERROR_VALUE, 0x10000, 0x10000, 0x10000, 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xdc00, 0xdc00, UTF_ERROR_VALUE, 0xd800, 0xd800, UTF_ERROR_VALUE, 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0000, 0x0000, 0x0000, 0x0061, 0x0061, 0x0061 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t movedOffset[]={ 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*next_unsafe next_safe_ns next_safe_s prev_unsafe prev_safe_ns prev_safe_s*/ 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1, 1, 1, 11, 11, 11, 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3, 3, 3, 9, 10 , 10, 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3, 3, 3, 8, 8, 8, 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5, 5, 4, 8, 8, 8, 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5, 5, 5, 7, 7, 7, 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6, 6, 6, 6, 6, 6, 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8, 7, 7, 5, 5, 5, 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8, 8, 8, 3, 3, 3, 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10, 10, 10, 3, 3, 3, 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10, 10, 10, 1, 1, 1, 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11, 11, 11, 1, 1, 1, 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12, 12, 12, 0, 0, 0, 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c=0x0000; 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t i=0; 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t offset=0, setOffset=0; 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(offset=0; offset<sizeof(input)/U_SIZEOF_UCHAR; offset++){ 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_NEXT_CHAR_UNSAFE(input, setOffset, c); 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != movedOffset[i]){ 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_NEXT_CHAR_UNSAFE failed to move the offset correctly at %d\n ExpectedOffset:%d Got %d\n", 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset, movedOffset[i], setOffset); 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i]){ 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_NEXT_CHAR_UNSAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, result[i], c); 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_NEXT_UNSAFE(input, setOffset, c); 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != movedOffset[i]){ 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_NEXT_CHAR_UNSAFE failed to move the offset correctly at %d\n ExpectedOffset:%d Got %d\n", 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset, movedOffset[i], setOffset); 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i]){ 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_NEXT_CHAR_UNSAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, result[i], c); 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_NEXT_CHAR_SAFE(input, setOffset, sizeof(input)/U_SIZEOF_UCHAR, c, FALSE); 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != movedOffset[i+1]){ 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_NEXT_CHAR_SAFE failed to move the offset correctly at %d\n ExpectedOffset:%d Got %d\n", 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset, movedOffset[i+1], setOffset); 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i+1]){ 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_NEXT_CHAR_SAFE failed for input=%ld. Expected:%lx Got:%lx\n", offset, result[i+1], c); 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_NEXT(input, setOffset, sizeof(input)/U_SIZEOF_UCHAR, c); 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != movedOffset[i+1]){ 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_NEXT failed to move the offset correctly at %d\n ExpectedOffset:%d Got %d\n", 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset, movedOffset[i+1], setOffset); 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i+1]){ 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_NEXT failed for input=%ld. Expected:%lx Got:%lx\n", offset, result[i+1], c); 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_NEXT_CHAR_SAFE(input, setOffset, sizeof(input)/U_SIZEOF_UCHAR, c, TRUE); 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != movedOffset[i+1]){ 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_NEXT_CHAR_SAFE(strict) failed to move the offset correctly at %d\n ExpectedOffset:%d Got %d\n", 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset, movedOffset[i+2], setOffset); 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i+2]){ 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_NEXT_CHAR_SAFE(strict) failed for input=%ld. Expected:%lx Got:%lx\n", offset, result[i+2], c); 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=(uint16_t)(i+6); 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=0; 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(offset=(uint16_t)sizeof(input)/U_SIZEOF_UCHAR; offset > 0; --offset){ 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_PREV_CHAR_UNSAFE(input, setOffset, c); 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != movedOffset[i+3]){ 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_PREV_CHAR_UNSAFE failed to move the offset correctly at %d\n ExpectedOffset:%d Got %d\n", 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset, movedOffset[i+3], setOffset); 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i+3]){ 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_PREV_CHAR_UNSAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, result[i+3], c); 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_PREV_UNSAFE(input, setOffset, c); 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != movedOffset[i+3]){ 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_PREV_CHAR_UNSAFE failed to move the offset correctly at %d\n ExpectedOffset:%d Got %d\n", 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset, movedOffset[i+3], setOffset); 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i+3]){ 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_PREV_CHAR_UNSAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, result[i+3], c); 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_PREV_CHAR_SAFE(input, 0, setOffset, c, FALSE); 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != movedOffset[i+4]){ 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_PREV_CHAR_SAFE failed to move the offset correctly at %d\n ExpectedOffset:%d Got %d\n", 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset, movedOffset[i+4], setOffset); 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i+4]){ 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_PREV_CHAR_SAFE failed for input=%ld. Expected:%lx Got:%lx\n", offset, result[i+4], c); 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_PREV(input, 0, setOffset, c); 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != movedOffset[i+4]){ 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_PREV failed to move the offset correctly at %d\n ExpectedOffset:%d Got %d\n", 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset, movedOffset[i+4], setOffset); 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i+4]){ 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_PREV failed for input=%ld. Expected:%lx Got:%lx\n", offset, result[i+4], c); 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_PREV_CHAR_SAFE(input, 0, setOffset, c, TRUE); 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != movedOffset[i+5]){ 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_PREV_CHAR_SAFE(strict) failed to move the offset correctly at %d\n ExpectedOffset:%d Got %d\n", 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset, movedOffset[i+5], setOffset); 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c != result[i+5]){ 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_PREV_CHAR_SAFE(strict) failed for input=%ld. Expected:%lx Got:%lx\n", offset, result[i+5], c); 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=(uint16_t)(i+6); 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* keep this in sync with utf8tst.c's TestNulTerminated() */ 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestNulTerminated() { 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar input[]={ 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 0 */ 0x61, 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 1 */ 0xd801, 0xdc01, 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 3 */ 0xdc01, 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 4 */ 0x62, 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 5 */ 0xd801, 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 6 */ 0x00 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 7 */ 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar32 result[]={ 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x61, 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x10401, 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xdc01, 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x62, 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd801, 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c, c2; 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i0, i=0, j, k, expectedIndex; 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t cpIndex=0; 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org do { 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i0=i; 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_NEXT(input, i, -1, c); 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c!=result[cpIndex]) { 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("U16_NEXT(from %d)=U+%04x != U+%04x\n", i0, c, result[cpIndex]); 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org j=i0; 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_FWD_1(input, j, -1); 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(j!=i) { 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("U16_FWD_1() moved to index %d but U16_NEXT() moved to %d\n", j, i); 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++cpIndex; 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Move by this many code points from the start. 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * U16_FWD_N() stops at the end of the string, that is, at the NUL if necessary. 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedIndex= (c==0) ? i-1 : i; 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org k=0; 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_FWD_N(input, k, -1, cpIndex); 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(k!=expectedIndex) { 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("U16_FWD_N(code points from 0) moved to index %d but expected %d\n", k, expectedIndex); 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } while(c!=0); 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=0; 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org do { 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org j=i0=i; 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_NEXT(input, i, -1, c); 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org do { 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_GET(input, 0, j, -1, c2); 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c2!=c) { 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("U16_NEXT(from %d)=U+%04x != U+%04x=U16_GET(at %d)\n", i0, c, c2, j); 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* U16_SET_CP_LIMIT moves from a non-lead byte to the limit of the code point */ 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org k=j+1; 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_SET_CP_LIMIT(input, 0, k, -1); 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(k!=i) { 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("U16_NEXT() moved to %d but U16_SET_CP_LIMIT(%d) moved to %d\n", i, j+1, k); 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } while(++j<i); 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } while(c!=0); 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestFwdBack(){ 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UChar input[]={0x0061, 0xd800, 0xdc00, 0xdbff, 0xdfff, 0x0062, 0xd841, 0xd7ff, 0xd841, 0xdc41, 0xdc00, 0x0000}; 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t fwd_unsafe[] ={1, 3, 5, 6, 8, 10, 11, 12}; 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t fwd_safe[] ={1, 3, 5, 6, 7, 8, 10, 11, 12}; 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t back_unsafe[]={11, 9, 8, 7, 6, 5, 3, 1, 0}; 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t back_safe[] ={11, 10, 8, 7, 6, 5, 3, 1, 0}; 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t Nvalue[]= {0, 1, 2, 3, 1, 2, 1}; 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t fwd_N_unsafe[] ={0, 1, 5, 10, 11}; 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t fwd_N_safe[] ={0, 1, 5, 8, 10, 12, 12}; /*safe macro keeps it at the end of the string */ 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t back_N_unsafe[]={12, 11, 8, 5, 3}; 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t back_N_safe[] ={12, 11, 8, 5, 3, 0, 0}; 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t offunsafe=0, offsafe=0; 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t i=0; 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(offunsafe < sizeof(input)/U_SIZEOF_UCHAR){ 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_FWD_1_UNSAFE(input, offunsafe); 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offunsafe != fwd_unsafe[i]){ 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: Forward_unsafe offset expected:%d, Got:%d\n", fwd_unsafe[i], offunsafe); 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i++; 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offunsafe=0, offsafe=0; 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=0; 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(offunsafe < sizeof(input)/U_SIZEOF_UCHAR){ 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_FWD_1_UNSAFE(input, offunsafe); 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offunsafe != fwd_unsafe[i]){ 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_FWD_1_UNSAFE offset expected:%d, Got:%d\n", fwd_unsafe[i], offunsafe); 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i++; 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=0; 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(offsafe < sizeof(input)/U_SIZEOF_UCHAR){ 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_FWD_1_SAFE(input, offsafe, sizeof(input)/U_SIZEOF_UCHAR); 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offsafe != fwd_safe[i]){ 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: Forward_safe offset expected:%d, Got:%d\n", fwd_safe[i], offsafe); 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i++; 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=0; 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(offsafe < sizeof(input)/U_SIZEOF_UCHAR){ 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_FWD_1(input, offsafe, sizeof(input)/U_SIZEOF_UCHAR); 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offsafe != fwd_safe[i]){ 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_FWD_1 offset expected:%d, Got:%d\n", fwd_safe[i], offsafe); 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i++; 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offunsafe=sizeof(input)/U_SIZEOF_UCHAR; 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offsafe=sizeof(input)/U_SIZEOF_UCHAR; 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=0; 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(offunsafe > 0){ 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_BACK_1_UNSAFE(input, offunsafe); 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offunsafe != back_unsafe[i]){ 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: Backward_unsafe offset expected:%d, Got:%d\n", back_unsafe[i], offunsafe); 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i++; 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offunsafe=sizeof(input)/U_SIZEOF_UCHAR; 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offsafe=sizeof(input)/U_SIZEOF_UCHAR; 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=0; 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(offunsafe > 0){ 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_BACK_1_UNSAFE(input, offunsafe); 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offunsafe != back_unsafe[i]){ 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_BACK_1_UNSAFE offset expected:%d, Got:%d\n", back_unsafe[i], offunsafe); 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i++; 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=0; 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(offsafe > 0){ 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_BACK_1_SAFE(input,0, offsafe); 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offsafe != back_safe[i]){ 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: Backward_safe offset expected:%d, Got:%d\n", back_unsafe[i], offsafe); 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i++; 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=0; 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(offsafe > 0){ 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_BACK_1(input,0, offsafe); 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offsafe != back_safe[i]){ 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_BACK_1 offset expected:%d, Got:%d\n", back_unsafe[i], offsafe); 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i++; 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offunsafe=0; 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offsafe=0; 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<sizeof(Nvalue)/sizeof(Nvalue[0])-2; i++){ /*didn't want it to fail(we assume 0<i<length)*/ 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_FWD_N_UNSAFE(input, offunsafe, Nvalue[i]); 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offunsafe != fwd_N_unsafe[i]){ 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: Forward_N_unsafe offset expected:%d, Got:%d\n", fwd_N_unsafe[i], offunsafe); 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offunsafe=0; 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<sizeof(Nvalue)/sizeof(Nvalue[0])-2; i++){ /*didn't want it to fail(we assume 0<i<length)*/ 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_FWD_N_UNSAFE(input, offunsafe, Nvalue[i]); 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offunsafe != fwd_N_unsafe[i]){ 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_FWD_N_UNSAFE offset expected:%d, Got:%d\n", fwd_N_unsafe[i], offunsafe); 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offsafe=0; 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<sizeof(Nvalue)/sizeof(Nvalue[0]); i++){ 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_FWD_N_SAFE(input, offsafe, sizeof(input)/U_SIZEOF_UCHAR, Nvalue[i]); 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offsafe != fwd_N_safe[i]){ 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: Forward_N_safe offset expected:%d, Got:%d\n", fwd_N_safe[i], offsafe); 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offsafe=0; 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<sizeof(Nvalue)/sizeof(Nvalue[0]); i++){ 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_FWD_N(input, offsafe, sizeof(input)/U_SIZEOF_UCHAR, Nvalue[i]); 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offsafe != fwd_N_safe[i]){ 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_FWD_N offset expected:%d, Got:%d\n", fwd_N_safe[i], offsafe); 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offunsafe=sizeof(input)/U_SIZEOF_UCHAR; 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<sizeof(Nvalue)/sizeof(Nvalue[0])-2; i++){ 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_BACK_N_UNSAFE(input, offunsafe, Nvalue[i]); 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offunsafe != back_N_unsafe[i]){ 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: backward_N_unsafe offset expected:%d, Got:%d\n", back_N_unsafe[i], offunsafe); 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offunsafe=sizeof(input)/U_SIZEOF_UCHAR; 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<sizeof(Nvalue)/sizeof(Nvalue[0])-2; i++){ 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_BACK_N_UNSAFE(input, offunsafe, Nvalue[i]); 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offunsafe != back_N_unsafe[i]){ 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_BACK_N_UNSAFE offset expected:%d, Got:%d\n", back_N_unsafe[i], offunsafe); 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offsafe=sizeof(input)/U_SIZEOF_UCHAR; 5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<sizeof(Nvalue)/sizeof(Nvalue[0]); i++){ 5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_BACK_N_SAFE(input, 0, offsafe, Nvalue[i]); 5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offsafe != back_N_safe[i]){ 5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: backward_N_safe offset expected:%d, Got:%d\n", back_N_safe[i], offsafe); 5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offsafe=sizeof(input)/U_SIZEOF_UCHAR; 5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<sizeof(Nvalue)/sizeof(Nvalue[0]); i++){ 5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_BACK_N(input, 0, offsafe, Nvalue[i]); 5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offsafe != back_N_safe[i]){ 5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_BACK_N offset expected:%d, Got:%d\n", back_N_safe[i], offsafe); 5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestSetChar(){ 5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UChar input[]={0x0061, 0xd800, 0xdc00, 0xdbff, 0xdfff, 0x0062, 0xd841, 0xd7ff, 0xd841, 0xdc41, 0xdc00, 0x0000}; 5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t start_unsafe[]={0, 1, 1, 3, 3, 5, 6, 7, 8, 8, 9, 11}; 5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t start_safe[] ={0, 1, 1, 3, 3, 5, 6, 7, 8, 8, 10, 11}; 5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t limit_unsafe[]={0, 1, 3, 3, 5, 5, 6, 8, 8, 10, 10, 11}; 5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t limit_safe[] ={0, 1, 3, 3, 5, 5, 6, 7, 8, 10, 10, 11}; 5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t i=0; 5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t offset=0, setOffset=0; 5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(offset=0; offset<sizeof(input)/U_SIZEOF_UCHAR; offset++){ 5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_SET_CHAR_START_UNSAFE(input, setOffset); 5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != start_unsafe[i]){ 5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_SET_CHAR_START_UNSAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, start_unsafe[i], setOffset); 5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_SET_CP_START_UNSAFE(input, setOffset); 5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != start_unsafe[i]){ 5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_SET_CHAR_START_UNSAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, start_unsafe[i], setOffset); 5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_SET_CHAR_START_SAFE(input, 0, setOffset); 5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != start_safe[i]){ 5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_SET_CHAR_START_SAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, start_safe[i], setOffset); 5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_SET_CP_START(input, 0, setOffset); 5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != start_safe[i]){ 5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_SET_CHAR_START failed for offset=%ld. Expected:%lx Got:%lx\n", offset, start_safe[i], setOffset); 5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (offset > 0) { 5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_SET_CHAR_LIMIT_UNSAFE(input, setOffset); 5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != limit_unsafe[i]){ 5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_SET_CHAR_LIMIT_UNSAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, limit_unsafe[i], setOffset); 5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_SET_CP_LIMIT_UNSAFE(input, setOffset); 6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != limit_unsafe[i]){ 6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_SET_CHAR_LIMIT_UNSAFE failed for offset=%ld. Expected:%lx Got:%lx\n", offset, limit_unsafe[i], setOffset); 6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setOffset=offset; 6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_SET_CP_LIMIT(input,0, setOffset, sizeof(input)/U_SIZEOF_UCHAR); 6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(setOffset != limit_safe[i]){ 6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: U16_SET_CHAR_LIMIT failed for offset=%ld. Expected:%lx Got:%lx\n", offset, limit_safe[i], setOffset); 6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i++; 6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestAppendChar(){ 6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UChar s[5]={0x0061, 0x0062, 0x0063, 0x0064, 0x0000}; 6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint32_t test[]={ 6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*append-position(unsafe), CHAR to be appended */ 6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0x20441, 6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2, 0x0028, 6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2, 0xdc00, 6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3, 0xd800, 6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1, 0x20402, 6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*append-position(safe), CHAR to be appended */ 6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0x20441, 6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2, 0xdc00, 6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3, 0xd800, 6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1, 0x20402, 6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3, 0x20402, 6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3, 0x10402, 6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2, 0x10402, 6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static uint16_t movedOffset[]={ 6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*offset-moved-to(unsafe)*/ 6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2, /*for append-pos: 0 , CHAR 0x20441*/ 6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3, 6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3, 6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4, 6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3, 6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*offse-moved-to(safe)*/ 6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2, /*for append-pos: 0, CHAR 0x20441*/ 6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3, 6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4, 6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3, 6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4, 6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4, 6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4 6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UChar result[][5]={ 6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*unsafe*/ 6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0xd841, 0xdc41, 0x0063, 0x0064, 0x0000}, 6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0x0061, 0x0062, 0x0028, 0x0064, 0x0000}, 6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0x0061, 0x0062, 0xdc00, 0x0064, 0x0000}, 6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0x0061, 0x0062, 0x0063, 0xd800, 0x0000}, 6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0x0061, 0xd841, 0xdc02, 0x0064, 0x0000}, 6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*safe*/ 6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0xd841, 0xdc41, 0x0063, 0x0064, 0x0000}, 6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0x0061, 0x0062, 0xdc00, 0x0064, 0x0000}, 6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0x0061, 0x0062, 0x0063, 0xd800, 0x0000}, 6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0x0061, 0xd841, 0xdc02, 0x0064, 0x0000}, 6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0x0061, 0x0062, 0x0063, UTF_ERROR_VALUE, 0x0000}, 6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0x0061, 0x0062, 0x0063, UTF_ERROR_VALUE, 0x0000}, 6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {0x0061, 0x0062, 0xd801, 0xdc02, 0x0000}, 6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t i, count=0; 6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *str=(UChar*)malloc(sizeof(UChar) * (u_strlen(s)+1)); 6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t offset; 6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<sizeof(test)/sizeof(test[0]); i=(uint16_t)(i+2)){ 6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(count<5){ 6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_strcpy(str, s); 6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset=(uint16_t)test[i]; 6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_APPEND_CHAR_UNSAFE(str, offset, test[i+1]); 6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offset != movedOffset[count]){ 6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_APPEND_CHAR_UNSAFE failed to move the offset correctly for count=%d.\nExpectedOffset=%d currentOffset=%d\n", 6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count, movedOffset[count], offset); 6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(u_strcmp(str, result[count]) !=0){ 6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_APPEND_CHAR_UNSAFE failed for count=%d. Expected:", count); 6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printUChars(result[count]); 6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("\nGot:"); 6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printUChars(str); 6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("\n"); 6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_strcpy(str, s); 6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org offset=(uint16_t)test[i]; 6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTF16_APPEND_CHAR_SAFE(str, offset, (uint16_t)u_strlen(str), test[i+1]); 6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offset != movedOffset[count]){ 6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_APPEND_CHAR_SAFE failed to move the offset correctly for count=%d.\nExpectedOffset=%d currentOffset=%d\n", 6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count, movedOffset[count], offset); 6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(u_strcmp(str, result[count]) !=0){ 7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ERROR: UTF16_APPEND_CHAR_SAFE failed for count=%d. Expected:", count); 7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printUChars(result[count]); 7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("\nGot:"); 7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printUChars(str); 7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("\n"); 7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count++; 7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org free(str); 7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestAppend() { 7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar32 codePoints[]={ 7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x61, 0xdf, 0x901, 0x3040, 7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xac00, 0xd800, 0xdbff, 0xdcde, 7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xdffd, 0xe000, 0xffff, 0x10000, 7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x12345, 0xe0021, 0x10ffff, 0x110000, 7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x234567, 0x7fffffff, -1, -1000, 7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0x400 7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar expectUnsafe[]={ 7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x61, 0xdf, 0x901, 0x3040, 7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xac00, 0xd800, 0xdbff, 0xdcde, 7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xdffd, 0xe000, 0xffff, 0xd800, 0xdc00, 7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd808, 0xdf45, 0xdb40, 0xdc21, 0xdbff, 0xdfff, /* not 0x110000 */ 7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* none from this line */ 7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0x400 7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }, expectSafe[]={ 7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x61, 0xdf, 0x901, 0x3040, 7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xac00, 0xd800, 0xdbff, 0xdcde, 7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xdffd, 0xe000, 0xffff, 0xd800, 0xdc00, 7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd808, 0xdf45, 0xdb40, 0xdc21, 0xdbff, 0xdfff, /* not 0x110000 */ 7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* none from this line */ 7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0x400 7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar buffer[100]; 7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c; 7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i, length; 7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isError, expectIsError, wrongIsError; 7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=0; 7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<LENGTHOF(codePoints); ++i) { 7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c=codePoints[i]; 7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c<0 || 0x10ffff<c) { 7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; /* skip non-code points for U16_APPEND_UNSAFE */ 7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_APPEND_UNSAFE(buffer, length, c); 7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(length!=LENGTHOF(expectUnsafe) || 0!=memcmp(buffer, expectUnsafe, length*U_SIZEOF_UCHAR)) { 7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("U16_APPEND_UNSAFE did not generate the expected output\n"); 7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=0; 7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org wrongIsError=FALSE; 7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<LENGTHOF(codePoints); ++i) { 7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c=codePoints[i]; 7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectIsError= c<0 || 0x10ffff<c; /* || U_IS_SURROGATE(c); */ /* surrogates in UTF-32 shouldn't be used, but it's okay to pass them around internally. */ 7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org isError=FALSE; 7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U16_APPEND(buffer, length, LENGTHOF(buffer), c, isError); 7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org wrongIsError|= isError!=expectIsError; 7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(wrongIsError) { 7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("U16_APPEND did not set isError correctly\n"); 7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(length!=LENGTHOF(expectSafe) || 0!=memcmp(buffer, expectSafe, length*U_SIZEOF_UCHAR)) { 7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("U16_APPEND did not generate the expected output\n"); 7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestSurrogate(){ 7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UChar32 s[] = {0x10000, 0x10ffff, 0x50000, 0x100000, 0x1abcd}; 7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i = 0; 7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (i < 5) { 7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar first = UTF_FIRST_SURROGATE(s[i]); 7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar second = UTF_SECOND_SURROGATE(s[i]); 7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* algorithm from the Unicode consortium */ 7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar firstresult = (UChar)(((s[i] - 0x10000) / 0x400) + 0xD800); 7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar secondresult = (UChar)(((s[i] - 0x10000) % 0x400) + 0xDC00); 7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (first != UTF16_LEAD(s[i]) || first != U16_LEAD(s[i]) || first != firstresult) { 7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Failure in first surrogate in 0x%x expected to be 0x%x\n", 7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s[i], firstresult); 7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (second != UTF16_TRAIL(s[i]) || second != U16_TRAIL(s[i]) || second != secondresult) { 7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Failure in second surrogate in 0x%x expected to be 0x%x\n", 7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s[i], secondresult); 7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i ++; 7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void printUChars(const UChar *uchars){ 7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int16_t i=0; 7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<u_strlen(uchars); i++){ 8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("%x ", *(uchars+i)); 8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 803