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