16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT:
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2013, International Business Machines Corporation and
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ustrtest.h"
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/appendable.h"
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/std_string.h"
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h"
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchar.h"
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/locid.h"
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucnv.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uenum.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utf16.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "charstr.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if 0
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustream.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <iostream>
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgusing namespace std;
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LENGTHOF(array) (int32_t)((sizeof(array)/sizeof((array)[0])))
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::~UnicodeStringTest() {}
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid UnicodeStringTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char *par)
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (exec) logln("TestSuite UnicodeStringTest: ");
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch (index) {
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 0:
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            name = "StringCaseTest";
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (exec) {
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                logln("StringCaseTest---"); logln("");
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                StringCaseTest test;
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                callTest(test, par);
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 1: name = "TestBasicManipulation"; if (exec) TestBasicManipulation(); break;
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 2: name = "TestCompare"; if (exec) TestCompare(); break;
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 3: name = "TestExtract"; if (exec) TestExtract(); break;
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 4: name = "TestRemoveReplace"; if (exec) TestRemoveReplace(); break;
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 5: name = "TestSearching"; if (exec) TestSearching(); break;
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 6: name = "TestSpacePadding"; if (exec) TestSpacePadding(); break;
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 7: name = "TestPrefixAndSuffix"; if (exec) TestPrefixAndSuffix(); break;
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 8: name = "TestFindAndReplace"; if (exec) TestFindAndReplace(); break;
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 9: name = "TestBogus"; if (exec) TestBogus(); break;
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 10: name = "TestReverse"; if (exec) TestReverse(); break;
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 11: name = "TestMiscellaneous"; if (exec) TestMiscellaneous(); break;
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 12: name = "TestStackAllocation"; if (exec) TestStackAllocation(); break;
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 13: name = "TestUnescape"; if (exec) TestUnescape(); break;
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 14: name = "TestCountChar32"; if (exec) TestCountChar32(); break;
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 15: name = "TestStringEnumeration"; if (exec) TestStringEnumeration(); break;
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 16: name = "TestNameSpace"; if (exec) TestNameSpace(); break;
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 17: name = "TestUTF32"; if (exec) TestUTF32(); break;
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 18: name = "TestUTF8"; if (exec) TestUTF8(); break;
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 19: name = "TestReadOnlyAlias"; if (exec) TestReadOnlyAlias(); break;
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 20: name = "TestAppendable"; if (exec) TestAppendable(); break;
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 21: name = "TestUnicodeStringImplementsAppendable"; if (exec) TestUnicodeStringImplementsAppendable(); break;
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 22: name = "TestSizeofUnicodeString"; if (exec) TestSizeofUnicodeString(); break;
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 23: name = "TestStartsWithAndEndsWithNulTerminated"; if (exec) TestStartsWithAndEndsWithNulTerminated(); break;
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        default: name = ""; break; //needed to end loop
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestBasicManipulation()
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test1("Now is the time for all men to come swiftly to the aid of the party.\n");
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   expectedValue;
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   *c;
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c=(UnicodeString *)test1.clone();
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.insert(24, "good ");
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "Now is the time for all good men to come swiftly to the aid of the party.\n";
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1 != expectedValue)
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("insert() failed:  expected \"" + expectedValue + "\"\n,got \"" + test1 + "\"");
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c->insert(24, "good ");
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(*c != expectedValue) {
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("clone()->insert() failed:  expected \"" + expectedValue + "\"\n,got \"" + *c + "\"");
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete c;
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.remove(41, 8);
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "Now is the time for all good men to come to the aid of the party.\n";
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1 != expectedValue)
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("remove() failed:  expected \"" + expectedValue + "\"\n,got \"" + test1 + "\"");
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.replace(58, 6, "ir country");
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "Now is the time for all good men to come to the aid of their country.\n";
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1 != expectedValue)
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("replace() failed:  expected \"" + expectedValue + "\"\n,got \"" + test1 + "\"");
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar     temp[80];
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.extract(0, 15, temp);
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString       test2(temp, 15);
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "Now is the time";
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test2 != expectedValue)
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("extract() failed:  expected \"" + expectedValue + "\"\n,got \"" + test2 + "\"");
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test2 += " for me to go!\n";
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "Now is the time for me to go!\n";
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test2 != expectedValue)
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("operator+=() failed:  expected \"" + expectedValue + "\"\n,got \"" + test2 + "\"");
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.length() != 70)
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("length() failed: expected 70, got ") + test1.length());
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test2.length() != 30)
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("length() failed: expected 30, got ") + test2.length());
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test3;
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.append((UChar32)0x20402);
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test3 != CharsToUnicodeString("\\uD841\\uDC02")){
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln((UnicodeString)"append failed for UChar32, expected \"\\\\ud841\\\\udc02\", got " + prettify(test3));
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test3.length() != 2){
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("append or length failed for UChar32, expected 2, got ") + test3.length());
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.append((UChar32)0x0074);
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test3 != CharsToUnicodeString("\\uD841\\uDC02t")){
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln((UnicodeString)"append failed for UChar32, expected \"\\\\uD841\\\\uDC02t\", got " + prettify(test3));
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test3.length() != 3){
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln((UnicodeString)"append or length failed for UChar32, expected 2, got " + test3.length());
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test some UChar32 overloads
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( test3.setTo((UChar32)0x10330).length() != 2 ||
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test3.insert(0, (UChar32)0x20100).length() != 4 ||
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test3.replace(2, 2, (UChar32)0xe0061).length() != 4 ||
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (test3 = (UChar32)0x14001).length() != 2
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln((UnicodeString)"simple UChar32 overloads for replace, insert, setTo or = failed");
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // test moveIndex32()
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString s=UNICODE_STRING("\\U0002f999\\U0001d15f\\u00c4\\u1ed0", 32).unescape();
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            s.moveIndex32(2, -1)!=0 ||
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            s.moveIndex32(2, 1)!=4 ||
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            s.moveIndex32(2, 2)!=5 ||
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            s.moveIndex32(5, -2)!=2 ||
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            s.moveIndex32(0, -1)!=0 ||
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            s.moveIndex32(6, 1)!=6
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ) {
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString::moveIndex32() failed");
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(s.getChar32Start(1)!=0 || s.getChar32Start(2)!=2) {
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString::getChar32Start() failed");
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(s.getChar32Limit(1)!=2 || s.getChar32Limit(2)!=2) {
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString::getChar32Limit() failed");
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // test new 2.2 constructors and setTo function that parallel Java's substring function.
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString src("Hello folks how are you?");
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString target1("how are you?");
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (target1 != UnicodeString(src, 12)) {
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString(const UnicodeString&, int32_t) failed");
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString target2("folks");
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (target2 != UnicodeString(src, 6, 5)) {
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString(const UnicodeString&, int32_t, int32_t) failed");
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (target1 != target2.setTo(src, 12)) {
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString::setTo(const UnicodeString&, int32_t) failed");
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // op+ is new in ICU 2.8
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString s=UnicodeString("abc", "")+UnicodeString("def", "")+UnicodeString("ghi", "");
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(s!=UnicodeString("abcdefghi", "")) {
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("operator+(UniStr, UniStr) failed");
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // tests for Jitterbug 2360
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // verify that APIs with source pointer + length accept length == -1
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // mostly test only where modified, only few functions did not already do this
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(UnicodeString("abc", -1, "")!=UnicodeString("abc", "")) {
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString(codepageData, dataLength, codepage) does not work with dataLength==-1");
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar buffer[10]={ 0x61, 0x62, 0x20ac, 0xd900, 0xdc05, 0,   0x62, 0xffff, 0xdbff, 0xdfff };
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString s, t(buffer, -1, LENGTHOF(buffer));
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(s.setTo(buffer, -1, LENGTHOF(buffer)).length()!=u_strlen(buffer)) {
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString.setTo(buffer, length, capacity) does not work with length==-1");
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(t.length()!=u_strlen(buffer)) {
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString(buffer, length, capacity) does not work with length==-1");
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(0!=s.caseCompare(buffer, -1, U_FOLD_CASE_DEFAULT)) {
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString.caseCompare(const UChar *, length, options) does not work with length==-1");
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(0!=s.caseCompare(0, s.length(), buffer, U_FOLD_CASE_DEFAULT)) {
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString.caseCompare(start, _length, const UChar *, options) does not work");
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buffer[u_strlen(buffer)]=0xe4;
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString u(buffer, -1, LENGTHOF(buffer));
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(s.setTo(buffer, -1, LENGTHOF(buffer)).length()!=LENGTHOF(buffer)) {
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString.setTo(buffer without NUL, length, capacity) does not work with length==-1");
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(u.length()!=LENGTHOF(buffer)) {
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString(buffer without NUL, length, capacity) does not work with length==-1");
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        static const char cs[]={ 0x61, (char)0xe4, (char)0x85, 0 };
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UConverter *cnv;
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode errorCode=U_ZERO_ERROR;
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cnv=ucnv_open("ISO-8859-1", &errorCode);
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString v(cs, -1, cnv, errorCode);
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucnv_close(cnv);
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(v!=CharsToUnicodeString("a\\xe4\\x85")) {
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString(const char *, length, cnv, errorCode) does not work with length==-1");
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_CHARSET_IS_UTF8
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Test the hardcoded-UTF-8 UnicodeString optimizations.
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        static const uint8_t utf8[]={ 0x61, 0xC3, 0xA4, 0xC3, 0x9F, 0xE4, 0xB8, 0x80, 0 };
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        static const UChar utf16[]={ 0x61, 0xE4, 0xDF, 0x4E00 };
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString from8a = UnicodeString((const char *)utf8);
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString from8b = UnicodeString((const char *)utf8, (int32_t)sizeof(utf8)-1);
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString from16(FALSE, utf16, LENGTHOF(utf16));
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(from8a != from16 || from8b != from16) {
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString(const char * U_CHARSET_IS_UTF8) failed");
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char buffer[16];
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t length8=from16.extract(0, 0x7fffffff, buffer, (uint32_t)sizeof(buffer));
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(length8!=((int32_t)sizeof(utf8)-1) || 0!=uprv_memcmp(buffer, utf8, sizeof(utf8))) {
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString::extract(char * U_CHARSET_IS_UTF8) failed");
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length8=from16.extract(1, 2, buffer, (uint32_t)sizeof(buffer));
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(length8!=4 || buffer[length8]!=0 || 0!=uprv_memcmp(buffer, utf8+1, length8)) {
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString::extract(substring to char * U_CHARSET_IS_UTF8) failed");
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestCompare()
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test1("this is a test");
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test2("this is a test");
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test3("this is a test of the emergency broadcast system");
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test4("never say, \"this is a test\"!!");
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test5((UChar)0x5000);
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test6((UChar)0x5100);
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar         uniChars[] = { 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0 };
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char            chars[] = "this is a test";
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test operator== and operator!=
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1 != test2 || test1 == test3 || test1 == test4)
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("operator== or operator!= failed");
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test operator> and operator<
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1 > test2 || test1 < test2 || !(test1 < test3) || !(test1 > test4) ||
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        !(test5 < test6)
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("operator> or operator< failed");
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test operator>= and operator<=
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!(test1 >= test2) || !(test1 <= test2) || !(test1 <= test3) || !(test1 >= test4))
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("operator>= or operator<= failed");
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test compare(UnicodeString)
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.compare(test2) != 0 || test1.compare(test3) >= 0 || test1.compare(test4) <= 0)
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("compare(UnicodeString) failed");
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //test compare(offset, length, UnicodeString)
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1.compare(0, 14, test2) != 0 ||
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test3.compare(0, 14, test2) != 0 ||
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test4.compare(12, 14, test2) != 0 ||
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test3.compare(0, 18, test1) <=0  )
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("compare(offset, length, UnicodeString) failes");
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test compare(UChar*)
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test2.compare(uniChars) != 0 || test3.compare(uniChars) <= 0 || test4.compare(uniChars) >= 0)
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("compare(UChar*) failed");
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test compare(char*)
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test2.compare(chars) != 0 || test3.compare(chars) <= 0 || test4.compare(chars) >= 0)
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("compare(char*) failed");
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test compare(UChar*, length)
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.compare(uniChars, 4) <= 0 || test1.compare(uniChars, 4) <= 0)
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("compare(UChar*, length) failed");
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test compare(thisOffset, thisLength, that, thatOffset, thatLength)
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.compare(0, 14, test2, 0, 14) != 0
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    || test1.compare(0, 14, test3, 0, 14) != 0
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    || test1.compare(0, 14, test4, 12, 14) != 0)
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("1. compare(thisOffset, thisLength, that, thatOffset, thatLength) failed");
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.compare(10, 4, test2, 0, 4) >= 0
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    || test1.compare(10, 4, test3, 22, 9) <= 0
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    || test1.compare(10, 4, test4, 22, 4) != 0)
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("2. compare(thisOffset, thisLength, that, thatOffset, thatLength) failed");
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test compareBetween
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.compareBetween(0, 14, test2, 0, 14) != 0 || test1.compareBetween(0, 14, test3, 0, 14) != 0
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    || test1.compareBetween(0, 14, test4, 12, 26) != 0)
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("compareBetween failed");
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.compareBetween(10, 14, test2, 0, 4) >= 0 || test1.compareBetween(10, 14, test3, 22, 31) <= 0
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    || test1.compareBetween(10, 14, test4, 22, 26) != 0)
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("compareBetween failed");
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test compare() etc. with strings that share a buffer but are not equal
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test2=test1; // share the buffer, length() too large for the stackBuffer
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test2.truncate(1); // change only the length, not the buffer
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( test1==test2 || test1<=test2 ||
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test1.compare(test2)<=0 ||
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test1.compareCodePointOrder(test2)<=0 ||
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test1.compareCodePointOrder(0, INT32_MAX, test2)<=0 ||
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test1.compareCodePointOrder(0, INT32_MAX, test2, 0, INT32_MAX)<=0 ||
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test1.compareCodePointOrderBetween(0, INT32_MAX, test2, 0, INT32_MAX)<=0 ||
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test1.caseCompare(test2, U_FOLD_CASE_DEFAULT)<=0
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeStrings that share a buffer but have different lengths compare as equal");
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test compareCodePointOrder() */
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* these strings are in ascending order */
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        static const UChar strings[][4]={
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x61, 0 },                    /* U+0061 */
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x20ac, 0xd801, 0 },          /* U+20ac U+d801 */
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0x20ac, 0xd800, 0xdc00, 0 },  /* U+20ac U+10000 */
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0xd800, 0 },                  /* U+d800 */
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0xd800, 0xff61, 0 },          /* U+d800 U+ff61 */
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0xdfff, 0 },                  /* U+dfff */
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0xff61, 0xdfff, 0 },          /* U+ff61 U+dfff */
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0xff61, 0xd800, 0xdc02, 0 },  /* U+ff61 U+10002 */
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0xd800, 0xdc02, 0 },          /* U+10002 */
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { 0xd84d, 0xdc56, 0 }           /* U+23456 */
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        };
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString u[20]; // must be at least as long as strings[]
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t i;
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; i<(int32_t)(sizeof(strings)/sizeof(strings[0])); ++i) {
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u[i]=UnicodeString(TRUE, strings[i], -1);
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i=0; i<(int32_t)(sizeof(strings)/sizeof(strings[0])-1); ++i) {
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(u[i].compareCodePointOrder(u[i+1])>=0 || u[i].compareCodePointOrder(0, INT32_MAX, u[i+1].getBuffer())>=0) {
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln("error: UnicodeString::compareCodePointOrder() fails for string %d and the following one\n", i);
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test caseCompare() */
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        static const UChar
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        _mixed[]=               { 0x61, 0x42, 0x131, 0x3a3, 0xdf,       0x130,       0x49,  0xfb03,           0xd93f, 0xdfff, 0 },
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        _otherDefault[]=        { 0x41, 0x62, 0x131, 0x3c3, 0x73, 0x53, 0x69, 0x307, 0x69,  0x46, 0x66, 0x49, 0xd93f, 0xdfff, 0 },
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        _otherExcludeSpecialI[]={ 0x41, 0x62, 0x131, 0x3c3, 0x53, 0x73, 0x69,        0x131, 0x66, 0x46, 0x69, 0xd93f, 0xdfff, 0 },
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        _different[]=           { 0x41, 0x62, 0x131, 0x3c3, 0x73, 0x53, 0x130,       0x49,  0x46, 0x66, 0x49, 0xd93f, 0xdffd, 0 };
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            mixed(TRUE, _mixed, -1),
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            otherDefault(TRUE, _otherDefault, -1),
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            otherExcludeSpecialI(TRUE, _otherExcludeSpecialI, -1),
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            different(TRUE, _different, -1);
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int8_t result;
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* test caseCompare() */
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result=mixed.caseCompare(otherDefault, U_FOLD_CASE_DEFAULT);
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(result!=0 || 0!=mixed.caseCompareBetween(0, INT32_MAX, otherDefault, 0, INT32_MAX, U_FOLD_CASE_DEFAULT)) {
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("error: mixed.caseCompare(other, default)=%ld instead of 0\n", result);
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result=mixed.caseCompare(otherExcludeSpecialI, U_FOLD_CASE_EXCLUDE_SPECIAL_I);
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(result!=0) {
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("error: mixed.caseCompare(otherExcludeSpecialI, U_FOLD_CASE_EXCLUDE_SPECIAL_I)=%ld instead of 0\n", result);
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result=mixed.caseCompare(otherDefault, U_FOLD_CASE_EXCLUDE_SPECIAL_I);
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(result==0 || 0==mixed.caseCompareBetween(0, INT32_MAX, otherDefault, 0, INT32_MAX, U_FOLD_CASE_EXCLUDE_SPECIAL_I)) {
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("error: mixed.caseCompare(other, U_FOLD_CASE_EXCLUDE_SPECIAL_I)=0 instead of !=0\n");
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* test caseCompare() */
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result=mixed.caseCompare(different, U_FOLD_CASE_DEFAULT);
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(result<=0) {
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("error: mixed.caseCompare(different, default)=%ld instead of positive\n", result);
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* test caseCompare() - include the folded sharp s (U+00df) with different lengths */
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result=mixed.caseCompare(1, 4, different, 1, 5, U_FOLD_CASE_DEFAULT);
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(result!=0 || 0!=mixed.caseCompareBetween(1, 5, different, 1, 6, U_FOLD_CASE_DEFAULT)) {
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("error: mixed.caseCompare(mixed, 1, 4, different, 1, 5, default)=%ld instead of 0\n", result);
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* test caseCompare() - stop in the middle of the sharp s (U+00df) */
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result=mixed.caseCompare(1, 4, different, 1, 4, U_FOLD_CASE_DEFAULT);
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(result<=0) {
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("error: mixed.caseCompare(1, 4, different, 1, 4, default)=%ld instead of positive\n", result);
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test that srcLength=-1 is handled in functions that
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // take input const UChar */int32_t srcLength (j785)
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        static const UChar u[]={ 0x61, 0x308, 0x62, 0 };
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString s=UNICODE_STRING("a\\u0308b", 8).unescape();
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(s.compare(u, -1)!=0 || s.compare(0, 999, u, 0, -1)!=0) {
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("error UnicodeString::compare(..., const UChar *, srcLength=-1) does not work");
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(s.compareCodePointOrder(u, -1)!=0 || s.compareCodePointOrder(0, 999, u, 0, -1)!=0) {
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("error UnicodeString::compareCodePointOrder(..., const UChar *, srcLength=-1, ...) does not work");
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(s.caseCompare(u, -1, U_FOLD_CASE_DEFAULT)!=0 || s.caseCompare(0, 999, u, 0, -1, U_FOLD_CASE_DEFAULT)!=0) {
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("error UnicodeString::caseCompare(..., const UChar *, srcLength=-1, ...) does not work");
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(s.indexOf(u, 1, -1, 0, 999)!=1 || s.indexOf(u+1, -1, 0, 999)!=1 || s.indexOf(u+1, -1, 0)!=1) {
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("error UnicodeString::indexOf(const UChar *, srcLength=-1, ...) does not work");
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(s.lastIndexOf(u, 1, -1, 0, 999)!=1 || s.lastIndexOf(u+1, -1, 0, 999)!=1 || s.lastIndexOf(u+1, -1, 0)!=1) {
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("error UnicodeString::lastIndexOf(const UChar *, srcLength=-1, ...) does not work");
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString s2, s3;
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        s2.replace(0, 0, u+1, -1);
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        s3.replace(0, 0, u, 1, -1);
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(s.compare(1, 999, s2)!=0 || s2!=s3) {
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("error UnicodeString::replace(..., const UChar *, srcLength=-1, ...) does not work");
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestExtract()
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString  test1("Now is the time for all good men to come to the aid of their country.", "");
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString  test2;
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          test3[13] = {1, 2, 3, 4, 5, 6, 7, 8, 8, 10, 11, 12, 13};
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char           test4[13] = {1, 2, 3, 4, 5, 6, 7, 8, 8, 10, 11, 12, 13};
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString  test5;
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char           test6[13] = {1, 2, 3, 4, 5, 6, 7, 8, 8, 10, 11, 12, 13};
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.extract(11, 12, test2);
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.extract(11, 12, test3);
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.extract(11, 12, test4) != 12 || test4[12] != 0) {
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.extract(char *) failed to return the correct size of destination buffer.");
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test proper pinning in extractBetween()
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.extractBetween(-3, 7, test5);
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test5!=UNICODE_STRING("Now is ", 7)) {
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.extractBetween(-3, 7) did not pin properly.");
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.extractBetween(11, 23, test5);
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.extract(60, 71, test6) != 9) {
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.extract() failed to return the correct size of destination buffer for end of buffer.");
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.extract(11, 12, test6) != 12) {
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.extract() failed to return the correct size of destination buffer.");
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // convert test4 back to Unicode for comparison
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test4b(test4, 12);
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.extract(11, 12, (char *)NULL) != 12) {
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.extract(NULL) failed to return the correct size of destination buffer.");
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.extract(11, -1, test6) != 0) {
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.extract(-1) failed to stop reading the string.");
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t i = 0; i < 12; i++) {
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (test1.charAt((int32_t)(11 + i)) != test2.charAt(i)) {
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln(UnicodeString("extracting into a UnicodeString failed at position ") + i);
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (test1.charAt((int32_t)(11 + i)) != test3[i]) {
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln(UnicodeString("extracting into an array of UChar failed at position ") + i);
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (((char)test1.charAt((int32_t)(11 + i))) != test4b.charAt(i)) {
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln(UnicodeString("extracting into an array of char failed at position ") + i);
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (test1.charAt((int32_t)(11 + i)) != test5.charAt(i)) {
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln(UnicodeString("extracting with extractBetween failed at position ") + i);
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test preflighting and overflows with invariant conversion
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.extract(0, 10, (char *)NULL, "") != 10) {
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.extract(0, 10, (char *)NULL, \"\") != 10");
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test4[2] = (char)0xff;
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.extract(0, 10, test4, 2, "") != 10) {
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.extract(0, 10, test4, 2, \"\") != 10");
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test4[2] != (char)0xff) {
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.extract(0, 10, test4, 2, \"\") overwrote test4[2]");
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // test new, NUL-terminating extract() function
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString s("terminate", "");
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar dest[20]={
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        };
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode errorCode;
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t length;
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=s.extract((UChar *)NULL, 0, errorCode);
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=s.length()) {
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString.extract(NULL, 0)==%d (%s) expected %d (U_BUFFER_OVERFLOW_ERROR)", length, s.length(), u_errorName(errorCode));
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=s.extract(dest, s.length()-1, errorCode);
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=s.length()) {
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString.extract(dest too short)==%d (%s) expected %d (U_BUFFER_OVERFLOW_ERROR)",
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                length, u_errorName(errorCode), s.length());
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=s.extract(dest, s.length(), errorCode);
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(errorCode!=U_STRING_NOT_TERMINATED_WARNING || length!=s.length()) {
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString.extract(dest just right without NUL)==%d (%s) expected %d (U_STRING_NOT_TERMINATED_WARNING)",
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                length, u_errorName(errorCode), s.length());
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(dest[length-1]!=s[length-1] || dest[length]!=0xa5) {
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString.extract(dest just right without NUL) did not extract the string correctly");
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length=s.extract(dest, s.length()+1, errorCode);
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(errorCode!=U_ZERO_ERROR || length!=s.length()) {
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString.extract(dest large enough)==%d (%s) expected %d (U_ZERO_ERROR)",
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                length, u_errorName(errorCode), s.length());
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(dest[length-1]!=s[length-1] || dest[length]!=0 || dest[length+1]!=0xa5) {
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString.extract(dest large enough) did not extract the string correctly");
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // test new UConverter extract() and constructor
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString s=UNICODE_STRING("\\U0002f999\\U0001d15f\\u00c4\\u1ed0", 32).unescape();
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char buffer[32];
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        static const char expect[]={
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (char)0xf0, (char)0xaf, (char)0xa6, (char)0x99,
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (char)0xf0, (char)0x9d, (char)0x85, (char)0x9f,
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (char)0xc3, (char)0x84,
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (char)0xe1, (char)0xbb, (char)0x90
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        };
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode errorCode=U_ZERO_ERROR;
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UConverter *cnv=ucnv_open("UTF-8", &errorCode);
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t length;
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(errorCode)) {
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // test preflighting
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if( (length=s.extract(NULL, 0, cnv, errorCode))!=13 ||
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errorCode!=U_BUFFER_OVERFLOW_ERROR
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ) {
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln("UnicodeString::extract(NULL, UConverter) preflighting failed (length=%ld, %s)",
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      length, u_errorName(errorCode));
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errorCode=U_ZERO_ERROR;
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if( (length=s.extract(buffer, 2, cnv, errorCode))!=13 ||
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errorCode!=U_BUFFER_OVERFLOW_ERROR
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ) {
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln("UnicodeString::extract(too small, UConverter) preflighting failed (length=%ld, %s)",
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      length, u_errorName(errorCode));
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // try error cases
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errorCode=U_ZERO_ERROR;
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if( s.extract(NULL, 2, cnv, errorCode)==13 || U_SUCCESS(errorCode)) {
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln("UnicodeString::extract(UConverter) succeeded with an illegal destination");
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errorCode=U_ILLEGAL_ARGUMENT_ERROR;
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if( s.extract(NULL, 0, cnv, errorCode)==13 || U_SUCCESS(errorCode)) {
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln("UnicodeString::extract(UConverter) succeeded with a previous error code");
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errorCode=U_ZERO_ERROR;
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // extract for real
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if( (length=s.extract(buffer, sizeof(buffer), cnv, errorCode))!=13 ||
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uprv_memcmp(buffer, expect, 13)!=0 ||
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                buffer[13]!=0 ||
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                U_FAILURE(errorCode)
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ) {
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln("UnicodeString::extract(UConverter) conversion failed (length=%ld, %s)",
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      length, u_errorName(errorCode));
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // Test again with just the converter name.
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if( (length=s.extract(0, s.length(), buffer, sizeof(buffer), "UTF-8"))!=13 ||
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uprv_memcmp(buffer, expect, 13)!=0 ||
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                buffer[13]!=0 ||
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                U_FAILURE(errorCode)
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ) {
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln("UnicodeString::extract(\"UTF-8\") conversion failed (length=%ld, %s)",
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      length, u_errorName(errorCode));
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // try the constructor
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UnicodeString t(expect, sizeof(expect), cnv, errorCode);
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_FAILURE(errorCode) || s!=t) {
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln("UnicodeString(UConverter) conversion failed (%s)",
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      u_errorName(errorCode));
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucnv_close(cnv);
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestRemoveReplace()
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test1("The rain in Spain stays mainly on the plain");
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test2("eat SPAMburgers!");
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar         test3[] = { 0x53, 0x50, 0x41, 0x4d, 0x4d, 0 };
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char            test4[] = "SPAM";
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString&  test5 = test1;
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.replace(4, 4, test2, 4, 4);
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.replace(12, 5, test3, 4);
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3[4] = 0;
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.replace(17, 4, test3);
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.replace(23, 4, test4);
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.replaceBetween(37, 42, test2, 4, 8);
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1 != "The SPAM in SPAM SPAMs SPAMly on the SPAM")
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("One of the replace methods failed:\n"
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "  expected \"The SPAM in SPAM SPAMs SPAMly on the SPAM\",\n"
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "  got \"" + test1 + "\"");
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.remove(21, 1);
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.removeBetween(26, 28);
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1 != "The SPAM in SPAM SPAM SPAM on the SPAM")
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("One of the remove methods failed:\n"
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "  expected \"The SPAM in SPAM SPAM SPAM on the SPAM\",\n"
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "  got \"" + test1 + "\"");
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t i = 0; i < test1.length(); i++) {
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (test5[i] != 0x53 && test5[i] != 0x50 && test5[i] != 0x41 && test5[i] != 0x4d && test5[i] != 0x20) {
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            test1.setCharAt(i, 0x78);
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1 != "xxx SPAM xx SPAM SPAM SPAM xx xxx SPAM")
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("One of the remove methods failed:\n"
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "  expected \"xxx SPAM xx SPAM SPAM SPAM xx xxx SPAM\",\n"
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "  got \"" + test1 + "\"");
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.remove();
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.length() != 0)
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Remove() failed: expected empty string, got \"" + test1 + "\"");
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestSearching()
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test1("test test ttest tetest testesteststt");
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test2("test");
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar testChar = 0x74;
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 testChar32 = 0x20402;
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar testData[]={
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //   0       1       2       3       4       5       6       7
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xd841, 0xdc02, 0x0071, 0xdc02, 0xd841, 0x0071, 0xd841, 0xdc02,
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //   8       9      10      11      12      13      14      15
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0071, 0x0072, 0xd841, 0xdc02, 0x0071, 0xd841, 0xdc02, 0x0071,
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //  16      17      18      19
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xdc02, 0xd841, 0x0073, 0x0000
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test3(testData);
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test4(testChar32);
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint16_t occurrences = 0;
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t startPos = 0;
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( ;
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          startPos != -1 && startPos < test1.length();
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          (startPos = test1.indexOf(test2, startPos)) != -1 ? (++occurrences, startPos += 4) : 0)
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ;
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 6)
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("indexOf failed: expected to find 6 occurrences, found ") + occurrences);
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( occurrences = 0, startPos = 10;
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          startPos != -1 && startPos < test1.length();
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          (startPos = test1.indexOf(test2, startPos)) != -1 ? (++occurrences, startPos += 4) : 0)
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ;
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 4)
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("indexOf with starting offset failed: "
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            "expected to find 4 occurrences, found ") + occurrences);
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t endPos = 28;
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( occurrences = 0, startPos = 5;
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          startPos != -1 && startPos < test1.length();
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          (startPos = test1.indexOf(test2, startPos, endPos - startPos)) != -1 ? (++occurrences, startPos += 4) : 0)
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ;
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 4)
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("indexOf with starting and ending offsets failed: "
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            "expected to find 4 occurrences, found ") + occurrences);
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //using UChar32 string
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( startPos=0, occurrences=0;
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          startPos != -1 && startPos < test3.length();
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          (startPos = test3.indexOf(test4, startPos)) != -1 ? (++occurrences, startPos += 2) : 0)
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ;
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 4)
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln((UnicodeString)"indexOf failed: expected to find 4 occurrences, found " + occurrences);
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( startPos=10, occurrences=0;
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          startPos != -1 && startPos < test3.length();
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          (startPos = test3.indexOf(test4, startPos)) != -1 ? (++occurrences, startPos += 2) : 0)
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ;
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 2)
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("indexOf failed: expected to find 2 occurrences, found ") + occurrences);
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //---
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( occurrences = 0, startPos = 0;
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          startPos != -1 && startPos < test1.length();
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          (startPos = test1.indexOf(testChar, startPos)) != -1 ? (++occurrences, startPos += 1) : 0)
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ;
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 16)
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("indexOf with character failed: "
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            "expected to find 16 occurrences, found ") + occurrences);
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( occurrences = 0, startPos = 10;
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          startPos != -1 && startPos < test1.length();
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          (startPos = test1.indexOf(testChar, startPos)) != -1 ? (++occurrences, startPos += 1) : 0)
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ;
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 12)
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("indexOf with character & start offset failed: "
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            "expected to find 12 occurrences, found ") + occurrences);
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( occurrences = 0, startPos = 5, endPos = 28;
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          startPos != -1 && startPos < test1.length();
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          (startPos = test1.indexOf(testChar, startPos, endPos - startPos)) != -1 ? (++occurrences, startPos += 1) : 0)
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ;
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 10)
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("indexOf with character & start & end offsets failed: "
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            "expected to find 10 occurrences, found ") + occurrences);
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //testing for UChar32
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString subString;
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for( occurrences =0, startPos=0; startPos < test3.length(); startPos +=1){
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        subString.append(test3, startPos, test3.length());
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(subString.indexOf(testChar32) != -1 ){
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             ++occurrences;
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        subString.remove();
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 14)
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln((UnicodeString)"indexOf failed: expected to find 14 occurrences, found " + occurrences);
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( occurrences = 0, startPos = 0;
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          startPos != -1 && startPos < test3.length();
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          (startPos = test3.indexOf(testChar32, startPos)) != -1 ? (++occurrences, startPos += 1) : 0)
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ;
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 4)
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln((UnicodeString)"indexOf failed: expected to find 4 occurrences, found " + occurrences);
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    endPos=test3.length();
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( occurrences = 0, startPos = 5;
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          startPos != -1 && startPos < test3.length();
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          (startPos = test3.indexOf(testChar32, startPos, endPos - startPos)) != -1 ? (++occurrences, startPos += 1) : 0)
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ;
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 3)
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln((UnicodeString)"indexOf with character & start & end offsets failed: expected to find 2 occurrences, found " + occurrences);
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //---
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1.lastIndexOf(test2)!=29) {
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("test1.lastIndexOf(test2)!=29");
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1.lastIndexOf(test2, 15)!=29 || test1.lastIndexOf(test2, 29)!=29 || test1.lastIndexOf(test2, 30)!=-1) {
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("test1.lastIndexOf(test2, start) failed");
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( occurrences = 0, startPos = 32;
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          startPos != -1;
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          (startPos = test1.lastIndexOf(test2, 5, startPos - 5)) != -1 ? ++occurrences : 0)
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ;
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 4)
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("lastIndexOf with starting and ending offsets failed: "
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            "expected to find 4 occurrences, found ") + occurrences);
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( occurrences = 0, startPos = 32;
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          startPos != -1;
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          (startPos = test1.lastIndexOf(testChar, 5, startPos - 5)) != -1 ? ++occurrences : 0)
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ;
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 11)
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("lastIndexOf with character & start & end offsets failed: "
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            "expected to find 11 occurrences, found ") + occurrences);
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //testing UChar32
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    startPos=test3.length();
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( occurrences = 0;
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          startPos != -1;
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          (startPos = test3.lastIndexOf(testChar32, 5, startPos - 5)) != -1 ? ++occurrences : 0)
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ;
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 3)
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln((UnicodeString)"lastIndexOf with character & start & end offsets failed: expected to find 3 occurrences, found " + occurrences);
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( occurrences = 0, endPos = test3.length();  endPos > 0; endPos -= 1){
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        subString.remove();
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        subString.append(test3, 0, endPos);
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(subString.lastIndexOf(testChar32) != -1 ){
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ++occurrences;
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (occurrences != 18)
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln((UnicodeString)"indexOf failed: expected to find 18 occurrences, found " + occurrences);
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //---
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test that indexOf(UChar32) and lastIndexOf(UChar32)
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // do not find surrogate code points when they are part of matched pairs
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // (= part of supplementary code points)
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Jitterbug 1542
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test3.indexOf((UChar32)0xd841) != 4 || test3.indexOf((UChar32)0xdc02) != 3) {
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("error: UnicodeString::indexOf(UChar32 surrogate) finds a partial supplementary code point");
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( UnicodeString(test3, 0, 17).lastIndexOf((UChar)0xd841, 0) != 4 ||
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString(test3, 0, 17).lastIndexOf((UChar32)0xd841, 2) != 4 ||
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test3.lastIndexOf((UChar32)0xd841, 0, 17) != 4 || test3.lastIndexOf((UChar32)0xdc02, 0, 17) != 16
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("error: UnicodeString::lastIndexOf(UChar32 surrogate) finds a partial supplementary code point");
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestSpacePadding()
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test1("hello");
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test2("   there");
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test3("Hi!  How ya doin'?  Beautiful day, isn't it?");
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test4;
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool returnVal;
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString expectedValue;
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    returnVal = test1.padLeading(15);
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "          hello";
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (returnVal == FALSE || test1 != expectedValue)
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("padLeading() failed: expected \"" + expectedValue + "\", got \"" + test1 + "\".");
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    returnVal = test2.padTrailing(15);
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "   there       ";
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (returnVal == FALSE || test2 != expectedValue)
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("padTrailing() failed: expected \"" + expectedValue + "\", got \"" + test2 + "\".");
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = test3;
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    returnVal = test3.padTrailing(15);
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (returnVal == TRUE || test3 != expectedValue)
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("padTrailing() failed: expected \"" + expectedValue + "\", got \"" + test3 + "\".");
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "hello";
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test4.setTo(test1).trim();
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test4 != expectedValue || test1 == expectedValue || test4 != expectedValue)
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("trim(UnicodeString&) failed");
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.trim();
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1 != expectedValue)
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("trim() failed: expected \"" + expectedValue + "\", got \"" + test1 + "\".");
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test2.trim();
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "there";
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test2 != expectedValue)
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("trim() failed: expected \"" + expectedValue + "\", got \"" + test2 + "\".");
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.trim();
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "Hi!  How ya doin'?  Beautiful day, isn't it?";
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test3 != expectedValue)
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("trim() failed: expected \"" + expectedValue + "\", got \"" + test3 + "\".");
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    returnVal = test1.truncate(15);
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "hello";
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (returnVal == TRUE || test1 != expectedValue)
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("truncate() failed: expected \"" + expectedValue + "\", got \"" + test1 + "\".");
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    returnVal = test2.truncate(15);
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "there";
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (returnVal == TRUE || test2 != expectedValue)
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("truncate() failed: expected \"" + expectedValue + "\", got \"" + test2 + "\".");
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    returnVal = test3.truncate(15);
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "Hi!  How ya doi";
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (returnVal == FALSE || test3 != expectedValue)
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("truncate() failed: expected \"" + expectedValue + "\", got \"" + test3 + "\".");
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestPrefixAndSuffix()
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test1("Now is the time for all good men to come to the aid of their country.");
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test2("Now");
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test3("country.");
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test4("count");
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!test1.startsWith(test2) || !test1.startsWith(test2, 0, test2.length())) {
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("startsWith() failed: \"" + test2 + "\" should be a prefix of \"" + test1 + "\".");
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.startsWith(test3) ||
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test1.startsWith(test3.getBuffer(), test3.length()) ||
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test1.startsWith(test3.getTerminatedBuffer(), 0, -1)
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("startsWith() failed: \"" + test3 + "\" shouldn't be a prefix of \"" + test1 + "\".");
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.endsWith(test2)) {
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("endsWith() failed: \"" + test2 + "\" shouldn't be a suffix of \"" + test1 + "\".");
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!test1.endsWith(test3)) {
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("endsWith(test3) failed: \"" + test3 + "\" should be a suffix of \"" + test1 + "\".");
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!test1.endsWith(test3, 0, INT32_MAX)) {
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("endsWith(test3, 0, INT32_MAX) failed: \"" + test3 + "\" should be a suffix of \"" + test1 + "\".");
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test1.endsWith(test3.getBuffer(), test3.length())) {
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("endsWith(test3.getBuffer(), test3.length()) failed: \"" + test3 + "\" should be a suffix of \"" + test1 + "\".");
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test1.endsWith(test3.getTerminatedBuffer(), 0, -1)) {
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("endsWith(test3.getTerminatedBuffer(), 0, -1) failed: \"" + test3 + "\" should be a suffix of \"" + test1 + "\".");
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!test3.startsWith(test4)) {
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("endsWith(test4) failed: \"" + test4 + "\" should be a prefix of \"" + test3 + "\".");
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test4.startsWith(test3)) {
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("startsWith(test3) failed: \"" + test3 + "\" shouldn't be a prefix of \"" + test4 + "\".");
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestStartsWithAndEndsWithNulTerminated() {
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test("abcde");
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar ab[] = { 0x61, 0x62, 0 };
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar de[] = { 0x64, 0x65, 0 };
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertTrue("abcde.startsWith(ab, -1)", test.startsWith(ab, -1));
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertTrue("abcde.startsWith(ab, 0, -1)", test.startsWith(ab, 0, -1));
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertTrue("abcde.endsWith(de, -1)", test.endsWith(de, -1));
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertTrue("abcde.endsWith(de, 0, -1)", test.endsWith(de, 0, -1));
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestFindAndReplace()
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test1("One potato, two potato, three potato, four\n");
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test2("potato");
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test3("MISSISSIPPI");
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString expectedValue;
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.findAndReplace(test2, test3);
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "One MISSISSIPPI, two MISSISSIPPI, three MISSISSIPPI, four\n";
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1 != expectedValue)
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("findAndReplace failed: expected \"" + expectedValue + "\", got \"" + test1 + "\".");
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.findAndReplace(2, 32, test3, test2);
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedValue = "One potato, two potato, three MISSISSIPPI, four\n";
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1 != expectedValue)
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("findAndReplace failed: expected \"" + expectedValue + "\", got \"" + test1 + "\".");
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestReverse()
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString test("backwards words say to used I");
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test.reverse();
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test.reverse(2, 4);
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test.reverse(7, 2);
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test.reverse(10, 3);
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test.reverse(14, 5);
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test.reverse(20, 9);
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test != "I used to say words backwards")
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("reverse() failed:  Expected \"I used to say words backwards\",\n got \""
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            + test + "\"");
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test=UNICODE_STRING("\\U0002f999\\U0001d15f\\u00c4\\u1ed0", 32).unescape();
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test.reverse();
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test.char32At(0)!=0x1ed0 || test.char32At(1)!=0xc4 || test.char32At(2)!=0x1d15f || test.char32At(4)!=0x2f999) {
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("reverse() failed with supplementary characters");
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Test case for ticket #8091:
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // UnicodeString::reverse() failed to see a lead surrogate in the middle of
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // an odd-length string that contains no other lead surrogates.
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test=UNICODE_STRING_SIMPLE("ab\\U0001F4A9e").unescape();
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString expected=UNICODE_STRING_SIMPLE("e\\U0001F4A9ba").unescape();
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test.reverse();
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test!=expected) {
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("reverse() failed with only lead surrogate in the middle");
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestMiscellaneous()
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test1("This is a test");
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test2("This is a test");
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test3("Me too!");
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test getBuffer(minCapacity) and releaseBuffer()
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1=UnicodeString(); // make sure that it starts with its stackBuffer
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar *p=test1.getBuffer(20);
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1.getCapacity()<20) {
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::getBuffer(20).getCapacity()<20");
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.append((UChar)7); // must not be able to modify the string here
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.setCharAt(3, 7);
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.reverse();
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( test1.length()!=0 ||
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test1.charAt(0)!=0xffff || test1.charAt(3)!=0xffff ||
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test1.getBuffer(10)!=0 || test1.getBuffer()!=0
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::getBuffer(minCapacity) allows read or write access to the UnicodeString");
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p[0]=1;
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p[1]=2;
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p[2]=3;
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.releaseBuffer(3);
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.append((UChar)4);
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1.length()!=4 || test1.charAt(0)!=1 || test1.charAt(1)!=2 || test1.charAt(2)!=3 || test1.charAt(3)!=4) {
10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::releaseBuffer(newLength) does not properly reallow access to the UnicodeString");
10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test releaseBuffer() without getBuffer(minCapacity) - must not have any effect
10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.releaseBuffer(1);
10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1.length()!=4 || test1.charAt(0)!=1 || test1.charAt(1)!=2 || test1.charAt(2)!=3 || test1.charAt(3)!=4) {
10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::releaseBuffer(newLength) without getBuffer(minCapacity) changed the UnicodeString");
10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test getBuffer(const)
10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar *q=test1.getBuffer(), *r=test1.getBuffer();
10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( test1.length()!=4 ||
10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        q[0]!=1 || q[1]!=2 || q[2]!=3 || q[3]!=4 ||
10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        r[0]!=1 || r[1]!=2 || r[2]!=3 || r[3]!=4
10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::getBuffer(const) does not return a usable buffer pointer");
10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test releaseBuffer() with a NUL-terminated buffer
10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.getBuffer(20)[2]=0;
10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.releaseBuffer(); // implicit -1
10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1.length()!=2 || test1.charAt(0)!=1 || test1.charAt(1) !=2) {
10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::releaseBuffer(-1) does not properly set the length of the UnicodeString");
10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test releaseBuffer() with a non-NUL-terminated buffer
10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p=test1.getBuffer(256);
10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(int32_t i=0; i<test1.getCapacity(); ++i) {
11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        p[i]=(UChar)1;      // fill the buffer with all non-NUL code units
11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.releaseBuffer();  // implicit -1
11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1.length()!=test1.getCapacity() || test1.charAt(1)!=1 || test1.charAt(100)!=1 || test1.charAt(test1.getCapacity()-1)!=1) {
11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::releaseBuffer(-1 but no NUL) does not properly set the length of the UnicodeString");
11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test getTerminatedBuffer()
11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1=UnicodeString("This is another test.", "");
11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test2=UnicodeString("This is another test.", "");
11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    q=test1.getTerminatedBuffer();
11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(q[test1.length()]!=0 || test1!=test2 || test2.compare(q, -1)!=0) {
11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("getTerminatedBuffer()[length]!=0");
11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar u[]={ 5, 6, 7, 8, 0 };
11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.setTo(FALSE, u, 3);
11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    q=test1.getTerminatedBuffer();
11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(q==u || q[0]!=5 || q[1]!=6 || q[2]!=7 || q[3]!=0) {
11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString(u[3]).getTerminatedBuffer() returns a bad buffer");
11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.setTo(TRUE, u, -1);
11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    q=test1.getTerminatedBuffer();
11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(q!=u || test1.length()!=4 || q[3]!=8 || q[4]!=0) {
11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString(u[-1]).getTerminatedBuffer() returns a bad buffer");
11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1=UNICODE_STRING("la", 2);
11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.append(UNICODE_STRING(" lila", 5).getTerminatedBuffer(), 0, -1);
11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1!=UNICODE_STRING("la lila", 7)) {
11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::append(const UChar *, start, length) failed");
11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.insert(3, UNICODE_STRING("dudum ", 6), 0, INT32_MAX);
11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1!=UNICODE_STRING("la dudum lila", 13)) {
11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::insert(start, const UniStr &, start, length) failed");
11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar ucs[]={ 0x68, 0x6d, 0x20, 0 };
11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.insert(9, ucs, -1);
11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1!=UNICODE_STRING("la dudum hm lila", 16)) {
11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::insert(start, const UChar *, length) failed");
11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.replace(9, 2, (UChar)0x2b);
11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1!=UNICODE_STRING("la dudum + lila", 15)) {
11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::replace(start, length, UChar) failed");
11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1.hasMetaData() || UnicodeString().hasMetaData()) {
11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::hasMetaData() returns TRUE");
11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test getTerminatedBuffer() on a truncated, shared, heap-allocated string
11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1=UNICODE_STRING_SIMPLE("abcdefghijklmnopqrstuvwxyz0123456789.");
11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.truncate(36);  // ensure length()<getCapacity()
11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test2=test1;  // share the buffer
11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.truncate(5);
11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1.length()!=5 || test1.getTerminatedBuffer()[5]!=0) {
11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString(shared buffer).truncate() failed");
11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test2.length()!=36 || test2[5]!=0x66 || u_strlen(test2.getTerminatedBuffer())!=36) {
11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString(shared buffer).truncate().getTerminatedBuffer() "
11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "modified another copy of the string!");
11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1=UNICODE_STRING_SIMPLE("abcdefghijklmnopqrstuvwxyz0123456789.");
11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.truncate(36);  // ensure length()<getCapacity()
11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test2=test1;  // share the buffer
11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.remove();
11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1.length()!=0 || test1.getTerminatedBuffer()[0]!=0) {
11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString(shared buffer).remove() failed");
11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test2.length()!=36 || test2[0]!=0x61 || u_strlen(test2.getTerminatedBuffer())!=36) {
11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString(shared buffer).remove().getTerminatedBuffer() "
11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "modified another copy of the string!");
11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // ticket #9740
11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.setTo(TRUE, ucs, 3);
11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertEquals("length of read-only alias", 3, test1.length());
11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test1.trim();
11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertEquals("length of read-only alias after trim()", 2, test1.length());
11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertEquals("length of terminated buffer of read-only alias + trim()",
11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 2, u_strlen(test1.getTerminatedBuffer()));
11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestStackAllocation()
11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           testString[] ={
11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x72, 0x61, 0x7a, 0x79, 0x20, 0x74, 0x65, 0x73, 0x74, 0x2e, 0 };
11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           guardWord = 0x4DED;
11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString*  test = 0;
11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test = new  UnicodeString(testString);
11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (*test != "This is a crazy test.")
11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Test string failed to initialize properly.");
11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (guardWord != 0x04DED)
11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Test string initialization overwrote guard word!");
12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test->insert(8, "only ");
12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test->remove(15, 6);
12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (*test != "This is only a test.")
12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Manipulation of test string failed to work right.");
12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (guardWord != 0x4DED)
12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Manipulation of test string overwrote guard word!");
12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // we have to deinitialize and release the backing store by calling the destructor
12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // explicitly, since we can't overload operator delete
12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete test;
12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar workingBuffer[] = {
12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20,
12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6d, 0x65, 0x6e, 0x20, 0x74, 0x6f, 0x20,
12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x63, 0x6f, 0x6d, 0x65, 0xffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar guardWord2 = 0x4DED;
12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test = new UnicodeString(workingBuffer, 35, 100);
12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (*test != "Now is the time for all men to come")
12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Stack-allocated backing store failed to initialize correctly.");
12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (guardWord2 != 0x4DED)
12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Stack-allocated backing store overwrote guard word!");
12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test->insert(24, "good ");
12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (*test != "Now is the time for all good men to come")
12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("insert() on stack-allocated UnicodeString didn't work right");
12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (guardWord2 != 0x4DED)
12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("insert() on stack-allocated UnicodeString overwrote guard word!");
12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (workingBuffer[24] != 0x67)
12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("insert() on stack-allocated UnicodeString didn't affect backing store");
12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *test += " to the aid of their country.";
12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (*test != "Now is the time for all good men to come to the aid of their country.")
12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Stack-allocated UnicodeString overflow didn't work");
12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (guardWord2 != 0x4DED)
12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Stack-allocated UnicodeString overflow overwrote guard word!");
12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *test = "ha!";
12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (*test != "ha!")
12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Assignment to stack-allocated UnicodeString didn't work");
12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (workingBuffer[0] != 0x4e)
12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Change to UnicodeString after overflow are still affecting original buffer");
12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (guardWord2 != 0x4DED)
12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Change to UnicodeString after overflow overwrote guard word!");
12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test read-only aliasing with setTo()
12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    workingBuffer[0] = 0x20ac;
12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    workingBuffer[1] = 0x125;
12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    workingBuffer[2] = 0;
12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test->setTo(TRUE, workingBuffer, 2);
12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test->length() != 2 || test->charAt(0) != 0x20ac || test->charAt(1) != 0x125) {
12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.setTo(readonly alias) does not alias correctly");
12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString *c=(UnicodeString *)test->clone();
12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    workingBuffer[1] = 0x109;
12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test->charAt(1) != 0x109) {
12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.setTo(readonly alias) made a copy: did not see change in buffer");
12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(c->length() != 2 || c->charAt(1) != 0x125) {
12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("clone(alias) did not copy the buffer");
12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete c;
12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test->setTo(TRUE, workingBuffer, -1);
12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test->length() != 2 || test->charAt(0) != 0x20ac || test->charAt(1) != 0x109) {
12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.setTo(readonly alias, length -1) does not alias correctly");
12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test->setTo(FALSE, workingBuffer, -1);
12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test->isBogus()) {
12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.setTo(unterminated readonly alias, length -1) does not result in isBogus()");
12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete test;
12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test=new UnicodeString();
12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar buffer[]={0x0061, 0x0062, 0x20ac, 0x0043, 0x0042, 0x0000};
12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test->setTo(buffer, 4, 10);
12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test->length() !=4 || test->charAt(0) != 0x0061 || test->charAt(1) != 0x0062 ||
12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test->charAt(2) != 0x20ac || test->charAt(3) != 0x0043){
12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln((UnicodeString)"UnicodeString.setTo(UChar*, length, capacity) does not work correctly\n" + prettify(*test));
12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete test;
12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test the UChar32 constructor
12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString c32Test((UChar32)0x10ff2a);
12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( c32Test.length() != U16_LENGTH(0x10ff2a) ||
12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c32Test.char32At(c32Test.length() - 1) != 0x10ff2a
12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("The UnicodeString(UChar32) constructor does not work with a 0x10ff2a filler");
12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test the (new) capacity constructor
13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString capTest(5, (UChar32)0x2a, 5);
13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( capTest.length() != 5 * U16_LENGTH(0x2a) ||
13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        capTest.char32At(0) != 0x2a ||
13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        capTest.char32At(4) != 0x2a
13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("The UnicodeString capacity constructor does not work with an ASCII filler");
13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    capTest = UnicodeString(5, (UChar32)0x10ff2a, 5);
13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( capTest.length() != 5 * U16_LENGTH(0x10ff2a) ||
13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        capTest.char32At(0) != 0x10ff2a ||
13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        capTest.char32At(4) != 0x10ff2a
13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("The UnicodeString capacity constructor does not work with a 0x10ff2a filler");
13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    capTest = UnicodeString(5, (UChar32)0, 0);
13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(capTest.length() != 0) {
13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("The UnicodeString capacity constructor does not work with a 0x10ff2a filler");
13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test the unescape() function.
13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid UnicodeStringTest::TestUnescape(void) {
13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString IN("abc\\u4567 \\n\\r \\U00101234xyz\\x1\\x{5289}\\x1b", -1, US_INV);
13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString OUT("abc");
13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    OUT.append((UChar)0x4567);
13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    OUT.append(" ");
13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    OUT.append((UChar)0xA);
13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    OUT.append((UChar)0xD);
13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    OUT.append(" ");
13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    OUT.append((UChar32)0x00101234);
13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    OUT.append("xyz");
13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    OUT.append((UChar32)1).append((UChar32)0x5289).append((UChar)0x1b);
13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString result = IN.unescape();
13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (result != OUT) {
13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: " + prettify(IN) + ".unescape() -> " +
13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              prettify(result) + ", expected " +
13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              prettify(OUT));
13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test that an empty string is returned in case of an error
13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!UNICODE_STRING("wrong \\u sequence", 17).unescape().isEmpty()) {
13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: unescaping of a string with an illegal escape sequence did not return an empty string");
13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test code point counting functions --------------------------------------- */
13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* reference implementation of UnicodeString::hasMoreChar32Than() */
13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t
13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org_refUnicodeStringHasMoreChar32Than(const UnicodeString &s, int32_t start, int32_t length, int32_t number) {
13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t count=s.countChar32(start, length);
13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return count>number;
13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* compare the real function against the reference */
13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::_testUnicodeStringHasMoreChar32Than(const UnicodeString &s, int32_t start, int32_t length, int32_t number) {
13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(s.hasMoreChar32Than(start, length, number)!=_refUnicodeStringHasMoreChar32Than(s, start, length, number)) {
13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("hasMoreChar32Than(%d, %d, %d)=%hd is wrong\n",
13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                start, length, number, s.hasMoreChar32Than(start, length, number));
13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestCountChar32(void) {
13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString s=UNICODE_STRING("\\U0002f999\\U0001d15f\\u00c4\\u1ed0", 32).unescape();
13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // test countChar32()
13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // note that this also calls and tests u_countChar32(length>=0)
13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(
13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            s.countChar32()!=4 ||
13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            s.countChar32(1)!=4 ||
13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            s.countChar32(2)!=3 ||
13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            s.countChar32(2, 3)!=2 ||
13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            s.countChar32(2, 0)!=0
13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ) {
13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("UnicodeString::countChar32() failed");
13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // NUL-terminate the string buffer and test u_countChar32(length=-1)
13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *buffer=s.getTerminatedBuffer();
13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(
13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_countChar32(buffer, -1)!=4 ||
13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_countChar32(buffer+1, -1)!=4 ||
13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_countChar32(buffer+2, -1)!=3 ||
13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_countChar32(buffer+3, -1)!=3 ||
13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_countChar32(buffer+4, -1)!=2 ||
13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_countChar32(buffer+5, -1)!=1 ||
13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_countChar32(buffer+6, -1)!=0
13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ) {
13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("u_countChar32(length=-1) failed");
13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // test u_countChar32() with bad input
14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(u_countChar32(NULL, 5)!=0 || u_countChar32(buffer, -2)!=0) {
14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("u_countChar32(bad input) failed (returned non-zero counts)");
14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test data and variables for hasMoreChar32Than() */
14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar str[]={
14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61, 0x62, 0xd800, 0xdc00,
14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xd801, 0xdc01, 0x63, 0xd802,
14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x64, 0xdc03, 0x65, 0x66,
14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xd804, 0xdc04, 0xd805, 0xdc05,
14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x67
14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString string(str, LENGTHOF(str));
14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t start, length, number;
14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test hasMoreChar32Than() */
14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(length=string.length(); length>=0; --length) {
14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(start=0; start<=length; ++start) {
14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for(number=-1; number<=((length-start)+2); ++number) {
14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                _testUnicodeStringHasMoreChar32Than(string, start, length-start, number);
14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test hasMoreChar32Than() with pinning */
14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(start=-1; start<=string.length()+1; ++start) {
14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(number=-1; number<=((string.length()-start)+2); ++number) {
14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            _testUnicodeStringHasMoreChar32Than(string, start, 0x7fffffff, number);
14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test hasMoreChar32Than() with a bogus string */
14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    string.setToBogus();
14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(length=-1; length<=1; ++length) {
14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(start=-1; start<=length; ++start) {
14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for(number=-1; number<=((length-start)+2); ++number) {
14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                _testUnicodeStringHasMoreChar32Than(string, start, length-start, number);
14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestBogus() {
14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test1("This is a test");
14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test2("This is a test");
14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString   test3("Me too!");
14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test isBogus() and setToBogus()
14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.isBogus() || test2.isBogus() || test3.isBogus()) {
14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("A string returned TRUE for isBogus()!");
14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // NULL pointers are treated like empty strings
14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // use other illegal arguments to make a bogus string
14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setTo(FALSE, test1.getBuffer(), -2);
14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus()) {
14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("A bogus string returned FALSE for isBogus()!");
14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.hashCode() != test2.hashCode() || test1.hashCode() == test3.hashCode()) {
14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("hashCode() failed");
14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test3.getBuffer()!=0 || test3.getBuffer(20)!=0 || test3.getTerminatedBuffer()!=0) {
14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.getBuffer()!=0");
14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.indexOf(test3) != -1) {
14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.indexOf() != -1");
14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.lastIndexOf(test3) != -1) {
14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.lastIndexOf() != -1");
14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.caseCompare(test3, U_FOLD_CASE_DEFAULT) != 1 || test3.caseCompare(test1, U_FOLD_CASE_DEFAULT) != -1) {
14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("caseCompare() doesn't work with bogus strings");
14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (test1.compareCodePointOrder(test3) != 1 || test3.compareCodePointOrder(test1) != -1) {
14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("compareCodePointOrder() doesn't work with bogus strings");
14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // verify that non-assignment modifications fail and do not revive a bogus string
14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.append((UChar)0x61);
14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.getBuffer()!=0) {
14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.append('a') worked but must not");
14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.findAndReplace(UnicodeString((UChar)0x61), test2);
14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.getBuffer()!=0) {
14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.findAndReplace() worked but must not");
14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.trim();
14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.getBuffer()!=0) {
14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.trim() revived bogus but must not");
14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.remove(1);
15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.getBuffer()!=0) {
15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.remove(1) revived bogus but must not");
15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.setCharAt(0, 0x62).isBogus() || !test3.isEmpty()) {
15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.setCharAt(0, 'b') worked but must not");
15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test3.truncate(1) || !test3.isBogus() || !test3.isEmpty()) {
15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.truncate(1) revived bogus but must not");
15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // verify that assignments revive a bogus string
15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || (test3=test1).isBogus() || test3!=test1) {
15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.operator=() failed");
15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.fastCopyFrom(test1).isBogus() || test3!=test1) {
15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.fastCopyFrom() failed");
15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.setTo(test1).isBogus() || test3!=test1) {
15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.setTo(UniStr) failed");
15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.setTo(test1, 0).isBogus() || test3!=test1) {
15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.setTo(UniStr, 0) failed");
15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.setTo(test1, 0, 0x7fffffff).isBogus() || test3!=test1) {
15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.setTo(UniStr, 0, len) failed");
15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.setTo(test1.getBuffer(), test1.length()).isBogus() || test3!=test1) {
15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.setTo(const UChar *, len) failed");
15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.setTo((UChar)0x2028).isBogus() || test3!=UnicodeString((UChar)0x2028)) {
15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.setTo(UChar) failed");
15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.setTo((UChar32)0x1d157).isBogus() || test3!=UnicodeString((UChar32)0x1d157)) {
15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.setTo(UChar32) failed");
15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.setTo(FALSE, test1.getBuffer(), test1.length()).isBogus() || test3!=test1) {
15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.setTo(readonly alias) failed");
15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // writable alias to another string's buffer: very bad idea, just convenient for this test
15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.setTo((UChar *)test1.getBuffer(), test1.length(), test1.getCapacity()).isBogus() || test3!=test1) {
15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.setTo(writable alias) failed");
15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // verify simple, documented ways to turn a bogus string into an empty one
15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || (test3=UnicodeString()).isBogus() || !test3.isEmpty()) {
15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.operator=(UnicodeString()) failed");
15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.setTo(UnicodeString()).isBogus() || !test3.isEmpty()) {
15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.setTo(UnicodeString()) failed");
15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test3.remove().isBogus() || test3.getBuffer()==0 || !test3.isEmpty()) {
15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.remove() failed");
15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test3.remove(0, INT32_MAX).isBogus() || test3.getBuffer()==0 || !test3.isEmpty()) {
15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.remove(0, INT32_MAX) failed");
15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test3.truncate(0) || test3.isBogus() || !test3.isEmpty()) {
15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.truncate(0) failed");
15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.setTo((UChar32)-1).isBogus() || !test3.isEmpty()) {
15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.setTo((UChar32)-1) failed");
15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar nul=0;
15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.setTo(&nul, 0).isBogus() || !test3.isEmpty()) {
16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus.setTo(&nul, 0) failed");
16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!test3.isBogus() || test3.getBuffer()!=0) {
16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("setToBogus() failed to make a string bogus");
16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test3.setToBogus();
16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1.isBogus() || !(test1=test3).isBogus()) {
16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("normal=bogus failed to make the left string bogus");
16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test that NULL primitive input string values are treated like
16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // empty strings, not errors (bogus)
16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test2.setTo((UChar32)0x10005);
16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test2.insert(1, NULL, 1).length()!=2) {
16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UniStr.insert(...NULL...) should not modify the string but does");
16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode=U_ZERO_ERROR;
16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString
16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test4((const UChar *)NULL),
16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test5(TRUE, (const UChar *)NULL, 1),
16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test6((UChar *)NULL, 5, 5),
16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        test7((const char *)NULL, 3, NULL, errorCode);
16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test4.isBogus() || test5.isBogus() || test6.isBogus() || test7.isBogus()) {
16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("a constructor set to bogus for a NULL input string, should be empty");
16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test4.setTo(NULL, 3);
16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test5.setTo(TRUE, (const UChar *)NULL, 1);
16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test6.setTo((UChar *)NULL, 5, 5);
16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test4.isBogus() || test5.isBogus() || test6.isBogus()) {
16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("a setTo() set to bogus for a NULL input string, should be empty");
16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test that bogus==bogus<any
16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1!=test3 || test1.compare(test3)!=0) {
16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus==bogus failed");
16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    test2.remove();
16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test1>=test2 || !(test2>test1) || test1.compare(test2)>=0 || !(test2.compare(test1)>0)) {
16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("bogus<empty failed");
16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// StringEnumeration ------------------------------------------------------- ***
16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// most of StringEnumeration is tested elsewhere
16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// this test improves code coverage
16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char *const
16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestEnumStrings[]={
16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "a",
16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "b",
16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "c",
16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "this is a long string which helps us test some buffer limits",
16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass TestEnumeration : public StringEnumeration {
16636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
16646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TestEnumeration() : i(0) {}
16656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t count(UErrorCode& /*status*/) const {
16676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return LENGTHOF(testEnumStrings);
16686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual const UnicodeString *snext(UErrorCode &status) {
16716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status) && i<LENGTHOF(testEnumStrings)) {
16726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            unistr=UnicodeString(testEnumStrings[i++], "");
16736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return &unistr;
16746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
16756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
16776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void reset(UErrorCode& /*status*/) {
16806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        i=0;
16816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static inline UClassID getStaticClassID() {
16846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return (UClassID)&fgClassID;
16856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UClassID getDynamicClassID() const {
16876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return getStaticClassID();
16886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
16916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char fgClassID;
16926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
16946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
16956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char TestEnumeration::fgClassID=0;
16976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
16996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestStringEnumeration() {
17006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString s;
17016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TestEnumeration ten;
17026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, length;
17036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status;
17046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar *pu;
17066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *pc;
17076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test the next() default implementation and ensureCharsCapacity()
17096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<LENGTHOF(testEnumStrings); ++i) {
17106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status=U_ZERO_ERROR;
17116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pc=ten.next(&length, status);
17126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        s=UnicodeString(testEnumStrings[i], "");
17136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status) || pc==NULL || length!=s.length() || UnicodeString(pc, length, "")!=s) {
17146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("StringEnumeration.next(%d) failed", i);
17156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status=U_ZERO_ERROR;
17186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(ten.next(&length, status)!=NULL) {
17196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("StringEnumeration.next(done)!=NULL");
17206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test the unext() default implementation
17236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ten.reset(status);
17246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<LENGTHOF(testEnumStrings); ++i) {
17256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status=U_ZERO_ERROR;
17266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pu=ten.unext(&length, status);
17276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        s=UnicodeString(testEnumStrings[i], "");
17286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status) || pu==NULL || length!=s.length() || UnicodeString(TRUE, pu, length)!=s) {
17296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("StringEnumeration.unext(%d) failed", i);
17306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status=U_ZERO_ERROR;
17336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(ten.unext(&length, status)!=NULL) {
17346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("StringEnumeration.unext(done)!=NULL");
17356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test that the default clone() implementation works, and returns NULL
17386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(ten.clone()!=NULL) {
17396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("StringEnumeration.clone()!=NULL");
17406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test that uenum_openFromStringEnumeration() works
17436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Need a heap allocated string enumeration because it is adopted by the UEnumeration.
17446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    StringEnumeration *newTen = new TestEnumeration;
17456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status=U_ZERO_ERROR;
17466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UEnumeration *uten = uenum_openFromStringEnumeration(newTen, &status);
17476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (uten==NULL || U_FAILURE(status)) {
17486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("fail at file %s, line %d, UErrorCode is %s\n", __FILE__, __LINE__, u_errorName(status));
17496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
17506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test  uenum_next()
17536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<LENGTHOF(testEnumStrings); ++i) {
17546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status=U_ZERO_ERROR;
17556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pc=uenum_next(uten, &length, &status);
17566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status) || pc==NULL || strcmp(pc, testEnumStrings[i]) != 0) {
17576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("File %s, line %d, StringEnumeration.next(%d) failed", __FILE__, __LINE__, i);
17586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status=U_ZERO_ERROR;
17616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(uenum_next(uten, &length, &status)!=NULL) {
17626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("File %s, line %d, uenum_next(done)!=NULL");
17636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test the uenum_unext()
17666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uenum_reset(uten, &status);
17676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<LENGTHOF(testEnumStrings); ++i) {
17686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status=U_ZERO_ERROR;
17696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pu=uenum_unext(uten, &length, &status);
17706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        s=UnicodeString(testEnumStrings[i], "");
17716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status) || pu==NULL || length!=s.length() || UnicodeString(TRUE, pu, length)!=s) {
17726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("File %s, Line %d, uenum_unext(%d) failed", __FILE__, __LINE__, i);
17736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status=U_ZERO_ERROR;
17766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(uenum_unext(uten, &length, &status)!=NULL) {
17776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("File %s, Line %d, uenum_unext(done)!=NULL" __FILE__, __LINE__);
17786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uenum_close(uten);
17816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
17826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
17846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Namespace test, to make sure that macros like UNICODE_STRING include the
17856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * namespace qualifier.
17866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
17876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Define a (bogus) UnicodeString class in another namespace and check for ambiguity.
17886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
17896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnamespace bogus {
17906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    class UnicodeString {
17916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    public:
17926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        enum EInvariant { kInvariant };
17936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString() : i(1) {}
17946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString(UBool /*isTerminated*/, const UChar * /*text*/, int32_t textLength) : i(textLength) {(void)i;}
17956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString(const char * /*src*/, int32_t length, enum EInvariant /*inv*/
17966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org) : i(length) {}
17976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    private:
17986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t i;
17996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
18006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
18016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
18036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestNameSpace() {
18046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Provoke name collision unless the UnicodeString macros properly
18056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // qualify the icu::UnicodeString class.
18066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    using namespace bogus;
18076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Use all UnicodeString macros from unistr.h.
18096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    icu::UnicodeString s1=icu::UnicodeString("abc", 3, US_INV);
18106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    icu::UnicodeString s2=UNICODE_STRING("def", 3);
18116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    icu::UnicodeString s3=UNICODE_STRING_SIMPLE("ghi");
18126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Make sure the compiler does not optimize away instantiation of s1, s2, s3.
18146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    icu::UnicodeString s4=s1+s2+s3;
18156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(s4.length()!=9) {
18166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Something wrong with UnicodeString::operator+().");
18176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
18196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
18216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestUTF32() {
18226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Input string length US_STACKBUF_SIZE to cause overflow of the
18236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // initially chosen fStackBuffer due to supplementary characters.
18246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 utf32[] = {
18256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x41, 0xd900, 0x61, 0xdc00, -1, 0x110000, 0x5a, 0x50000, 0x7a,
18266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x10000, 0x20000, 0xe0000, 0x10ffff
18276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
18286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar expected_utf16[] = {
18296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x41, 0xfffd, 0x61, 0xfffd, 0xfffd, 0xfffd, 0x5a, 0xd900, 0xdc00, 0x7a,
18306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xd800, 0xdc00, 0xd840, 0xdc00, 0xdb40, 0xdc00, 0xdbff, 0xdfff
18316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
18326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString from32 = UnicodeString::fromUTF32(utf32, LENGTHOF(utf32));
18336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString expected(FALSE, expected_utf16, LENGTHOF(expected_utf16));
18346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(from32 != expected) {
18356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::fromUTF32() did not create the expected string.");
18366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar utf16[] = {
18396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x41, 0xd900, 0x61, 0xdc00, 0x5a, 0xd900, 0xdc00, 0x7a, 0xd800, 0xdc00, 0xdbff, 0xdfff
18406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
18416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar32 expected_utf32[] = {
18426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x41, 0xfffd, 0x61, 0xfffd, 0x5a, 0x50000, 0x7a, 0x10000, 0x10ffff
18436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
18446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 result32[16];
18456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode = U_ZERO_ERROR;
18466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length32 =
18476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString(FALSE, utf16, LENGTHOF(utf16)).
18486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        toUTF32(result32, LENGTHOF(result32), errorCode);
18496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( length32 != LENGTHOF(expected_utf32) ||
18506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0 != uprv_memcmp(result32, expected_utf32, length32*4) ||
18516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result32[length32] != 0
18526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
18536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::toUTF32() did not create the expected string.");
18546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
18566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass TestCheckedArrayByteSink : public CheckedArrayByteSink {
18586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
18596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TestCheckedArrayByteSink(char* outbuf, int32_t capacity)
18606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            : CheckedArrayByteSink(outbuf, capacity), calledFlush(FALSE) {}
18616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void Flush() { calledFlush = TRUE; }
18626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool calledFlush;
18636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
18646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
18666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestUTF8() {
18676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const uint8_t utf8[] = {
18686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Code points:
18696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // 0x41, 0xd900,
18706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // 0x61, 0xdc00,
18716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // 0x110000, 0x5a,
18726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // 0x50000, 0x7a,
18736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // 0x10000, 0x20000,
18746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // 0xe0000, 0x10ffff
18756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x41, 0xed, 0xa4, 0x80,
18766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61, 0xed, 0xb0, 0x80,
18776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xf4, 0x90, 0x80, 0x80, 0x5a,
18786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xf1, 0x90, 0x80, 0x80, 0x7a,
18796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xf0, 0x90, 0x80, 0x80, 0xf0, 0xa0, 0x80, 0x80,
18806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xf3, 0xa0, 0x80, 0x80, 0xf4, 0x8f, 0xbf, 0xbf
18816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
18826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar expected_utf16[] = {
18836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x41, 0xfffd,
18846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61, 0xfffd,
18856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfffd, 0x5a,
18866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xd900, 0xdc00, 0x7a,
18876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xd800, 0xdc00, 0xd840, 0xdc00,
18886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xdb40, 0xdc00, 0xdbff, 0xdfff
18896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
18906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString from8 = UnicodeString::fromUTF8(StringPiece((const char *)utf8, (int32_t)sizeof(utf8)));
18916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString expected(FALSE, expected_utf16, LENGTHOF(expected_utf16));
18926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(from8 != expected) {
18946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::fromUTF8(StringPiece) did not create the expected string.");
18956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_HAVE_STD_STRING
18976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    std::string utf8_string((const char *)utf8, sizeof(utf8));
18986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString from8b = UnicodeString::fromUTF8(utf8_string);
18996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(from8b != expected) {
19006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::fromUTF8(std::string) did not create the expected string.");
19016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
19036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar utf16[] = {
19056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x41, 0xd900, 0x61, 0xdc00, 0x5a, 0xd900, 0xdc00, 0x7a, 0xd800, 0xdc00, 0xdbff, 0xdfff
19066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
19076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const uint8_t expected_utf8[] = {
19086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x41, 0xef, 0xbf, 0xbd, 0x61, 0xef, 0xbf, 0xbd, 0x5a, 0xf1, 0x90, 0x80, 0x80, 0x7a,
19096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xf0, 0x90, 0x80, 0x80, 0xf4, 0x8f, 0xbf, 0xbf
19106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
19116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString us(FALSE, utf16, LENGTHOF(utf16));
19126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char buffer[64];
19146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TestCheckedArrayByteSink sink(buffer, (int32_t)sizeof(buffer));
19156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    us.toUTF8(sink);
19166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( sink.NumberOfBytesWritten() != (int32_t)sizeof(expected_utf8) ||
19176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0 != uprv_memcmp(buffer, expected_utf8, sizeof(expected_utf8))
19186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ) {
19196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::toUTF8() did not create the expected string.");
19206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!sink.calledFlush) {
19226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::toUTF8(sink) did not sink.Flush().");
19236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_HAVE_STD_STRING
19256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Initial contents for testing that toUTF8String() appends.
19266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    std::string result8 = "-->";
19276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    std::string expected8 = "-->" + std::string((const char *)expected_utf8, sizeof(expected_utf8));
19286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Use the return value just for testing.
19296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    std::string &result8r = us.toUTF8String(result8);
19306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(result8r != expected8 || &result8r != &result8) {
19316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString::toUTF8String() did not create the expected string.");
19326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
19346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
19356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Test if this compiler supports Return Value Optimization of unnamed temporary objects.
19376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UnicodeString wrapUChars(const UChar *uchars) {
19386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return UnicodeString(TRUE, uchars, -1);
19396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
19406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
19426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestReadOnlyAlias() {
19436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar uchars[]={ 0x61, 0x62, 0 };
19446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString alias(TRUE, uchars, 2);
19456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(alias.length()!=2 || alias.getBuffer()!=uchars || alias.getTerminatedBuffer()!=uchars) {
19466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString read-only-aliasing constructor does not behave as expected.");
19476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
19486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    alias.truncate(1);
19506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(alias.length()!=1 || alias.getBuffer()!=uchars) {
19516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString(read-only-alias).truncate() did not preserve aliasing as expected.");
19526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(alias.getTerminatedBuffer()==uchars) {
19546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString(read-only-alias).truncate().getTerminatedBuffer() "
19556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "did not allocate and copy as expected.");
19566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(uchars[1]!=0x62) {
19586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString(read-only-alias).truncate().getTerminatedBuffer() "
19596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "modified the original buffer.");
19606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(1!=u_strlen(alias.getTerminatedBuffer())) {
19626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString(read-only-alias).truncate().getTerminatedBuffer() "
19636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "does not return a buffer terminated at the proper length.");
19646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    alias.setTo(TRUE, uchars, 2);
19676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(alias.length()!=2 || alias.getBuffer()!=uchars || alias.getTerminatedBuffer()!=uchars) {
19686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString read-only-aliasing setTo() does not behave as expected.");
19696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
19706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    alias.remove();
19726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(alias.length()!=0) {
19736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString(read-only-alias).remove() did not work.");
19746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(alias.getTerminatedBuffer()==uchars) {
19766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString(read-only-alias).remove().getTerminatedBuffer() "
19776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "did not un-alias as expected.");
19786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(uchars[0]!=0x61) {
19806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString(read-only-alias).remove().getTerminatedBuffer() "
19816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "modified the original buffer.");
19826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(0!=u_strlen(alias.getTerminatedBuffer())) {
19846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.setTo(read-only-alias).remove().getTerminatedBuffer() "
19856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "does not return a buffer terminated at length 0.");
19866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString longString=UNICODE_STRING_SIMPLE("abcdefghijklmnopqrstuvwxyz0123456789");
19896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    alias.setTo(FALSE, longString.getBuffer(), longString.length());
19906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    alias.remove(0, 10);
19916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(longString.compare(10, INT32_MAX, alias)!=0 || alias.getBuffer()!=longString.getBuffer()+10) {
19926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.setTo(read-only-alias).remove(0, 10) did not preserve aliasing as expected.");
19936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    alias.setTo(FALSE, longString.getBuffer(), longString.length());
19956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    alias.remove(27, 99);
19966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(longString.compare(0, 27, alias)!=0 || alias.getBuffer()!=longString.getBuffer()) {
19976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.setTo(read-only-alias).remove(27, 99) did not preserve aliasing as expected.");
19986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    alias.setTo(FALSE, longString.getBuffer(), longString.length());
20006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    alias.retainBetween(6, 30);
20016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(longString.compare(6, 24, alias)!=0 || alias.getBuffer()!=longString.getBuffer()+6) {
20026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.setTo(read-only-alias).retainBetween(6, 30) did not preserve aliasing as expected.");
20036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar abc[]={ 0x61, 0x62, 0x63, 0 };
20066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool hasRVO= wrapUChars(abc).getBuffer()==abc;
20076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString temp;
20096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp.fastCopyFrom(longString.tempSubString());
20106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(temp!=longString || (hasRVO && temp.getBuffer()!=longString.getBuffer())) {
20116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.tempSubString() failed");
20126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp.fastCopyFrom(longString.tempSubString(-3, 5));
20146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(longString.compare(0, 5, temp)!=0 || (hasRVO && temp.getBuffer()!=longString.getBuffer())) {
20156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.tempSubString(-3, 5) failed");
20166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp.fastCopyFrom(longString.tempSubString(17));
20186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(longString.compare(17, INT32_MAX, temp)!=0 || (hasRVO && temp.getBuffer()!=longString.getBuffer()+17)) {
20196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.tempSubString(17) failed");
20206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp.fastCopyFrom(longString.tempSubString(99));
20226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!temp.isEmpty()) {
20236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.tempSubString(99) failed");
20246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp.fastCopyFrom(longString.tempSubStringBetween(6));
20266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(longString.compare(6, INT32_MAX, temp)!=0 || (hasRVO && temp.getBuffer()!=longString.getBuffer()+6)) {
20276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.tempSubStringBetween(6) failed");
20286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp.fastCopyFrom(longString.tempSubStringBetween(8, 18));
20306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(longString.compare(8, 10, temp)!=0 || (hasRVO && temp.getBuffer()!=longString.getBuffer()+8)) {
20316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.tempSubStringBetween(8, 18) failed");
20326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString bogusString;
20346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bogusString.setToBogus();
20356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp.fastCopyFrom(bogusString.tempSubStringBetween(8, 18));
20366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!temp.isBogus()) {
20376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("UnicodeString.setToBogus().tempSubStringBetween(8, 18) failed");
20386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
20406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
20426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::doTestAppendable(UnicodeString &dest, Appendable &app) {
20436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar cde[3]={ 0x63, 0x64, 0x65 };
20446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar fg[3]={ 0x66, 0x67, 0 };
20456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!app.reserveAppendCapacity(12)) {
20466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Appendable.reserve(12) failed");
20476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    app.appendCodeUnit(0x61);
20496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    app.appendCodePoint(0x62);
20506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    app.appendCodePoint(0x50000);
20516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    app.appendString(cde, 3);
20526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    app.appendString(fg, -1);
20536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar scratch[3];
20546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t capacity=-1;
20556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar *buffer=app.getAppendBuffer(3, 3, scratch, 3, &capacity);
20566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(capacity<3) {
20576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Appendable.getAppendBuffer(min=3) returned capacity=%d<3", (int)capacity);
20586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
20596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar hij[3]={ 0x68, 0x69, 0x6a };
20616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_memcpy(buffer, hij, 3);
20626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    app.appendString(buffer, 3);
20636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(dest!=UNICODE_STRING_SIMPLE("ab\\U00050000cdefghij").unescape()) {
20646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Appendable.append(...) failed");
20656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    buffer=app.getAppendBuffer(0, 3, scratch, 3, &capacity);
20676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(buffer!=NULL || capacity!=0) {
20686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Appendable.getAppendBuffer(min=0) failed");
20696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    capacity=1;
20716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    buffer=app.getAppendBuffer(3, 3, scratch, 2, &capacity);
20726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(buffer!=NULL || capacity!=0) {
20736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Appendable.getAppendBuffer(scratch<min) failed");
20746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
20766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass SimpleAppendable : public Appendable {
20786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
20796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    explicit SimpleAppendable(UnicodeString &dest) : str(dest) {}
20806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UBool appendCodeUnit(UChar c) { str.append(c); return TRUE; }
20816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleAppendable &reset() { str.remove(); return *this; }
20826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
20836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString &str;
20846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
20856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
20876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestAppendable() {
20886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString dest;
20896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleAppendable app(dest);
20906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doTestAppendable(dest, app);
20916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
20926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
20946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestUnicodeStringImplementsAppendable() {
20956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString dest;
20966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeStringAppendable app(dest);
20976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doTestAppendable(dest, app);
20986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
20996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
21016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestSizeofUnicodeString() {
21026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // See the comments in unistr.h near the declaration of UnicodeString's fields.
21036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    size_t sizeofUniStr=sizeof(UnicodeString);
21046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    size_t expected;
21056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch(sizeof(void *)) {
21066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case 4:
21076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        expected=32;
21086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
21096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case 8:
21106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        expected=40;
21116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
21126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    default:
21136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln("This platform has neither 32-bit nor 64-bit pointers.");
21146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
21156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(expected!=sizeofUniStr) {
21176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("sizeof(UnicodeString)=%d, expected %d", (int)sizeofUniStr, (int)expected);
21186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2120